/**
* 在某些情况下,数据呈树形,但是每个树节点节点的类型不一定相同
* 这种情况下可以构建抽象的父类让各节点的类型继承,
* 再利用组合设计模式进行构造数据
* @author
* @version 0.1
*/
abstract class MusicClass {
public String name;
public ArrayList<MusicClass> list;
//抽象的添加方法
public abstract void add(MusicClass component);
//抽象的删除方法
public abstract void remove(MusicClass component);
//展示所有子节点
public abstract void display();
}
class Song extends MusicClass{
//使用组合模式,请构造Song类,歌曲:+name
public Song(){}
public Song(String name){
this.name = name;
}
//重写父类添加方法
@Override
public void add(MusicClass component) {
list.add(component);
}
//重写父类删除方法
@Override
public void remove(MusicClass component) {
list.remove(component);
}
//重写父类展示方法
@Override
public void display() {
Iterator<MusicClass> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next().name);
}
}
}
class ConcreteMusicClass extends MusicClass{
//使用组合模式,构造ConcreteMusicClass类,并打印歌手名称
public ConcreteMusicClass (){
}
public ConcreteMusicClass(String name){
this.name = name;
this.list = new ArrayList<MusicClass>();
}
//重写父类添加方法
@Override
public void add(MusicClass component) {
list.add(component);
}
//重写父类删除方法
@Override
public void remove(MusicClass component) {
list.remove(component);
}
//重写父类展示方法
@Override
public void display() {
Iterator<MusicClass> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next().name);
}
}
}
public class CompositeTest {
public static void main(String args[]){
//创建Song类型的子节点
Song song1=new Song("七里香");
Song song2=new Song("东风破");
//创建ConcreteMusicClass类型的子节点
ConcreteMusicClass concreteMusicClassZhou=new ConcreteMusicClass("周杰伦");
Song song3=new Song("我的歌声里");
Song song4=new Song("jar of love");
ConcreteMusicClass concreteMusicClassQu=new ConcreteMusicClass("曲婉婷");
//创建root节点
ConcreteMusicClass root=new ConcreteMusicClass("root");
concreteMusicClassZhou.add(song1);
concreteMusicClassZhou.add(song2);
concreteMusicClassQu.add(song3);
concreteMusicClassQu.add(song4);
root.add(concreteMusicClassZhou);
root.add(concreteMusicClassQu);
root.display();
}
}