组合模式允许你将对象组成树形结构,来表现整体和部分的联系.组合能让客户以一致的方式处理个别对象和对象的组合.
组合模式将整体称为组合.(类似于树结构中的树),将组合下面没有其他元素相连的物件称为叶结点.其中,组合和叶结点有着共同的父类,可以将两者所有的方法抽象到父类中,并且对方法有默认的实现,这样如果叶结点或者组合不想实现某个方法的时候,就可以不实现方法.通过将菜单和项放在相同的结构中,我们创建了一个整体/部分的层次结构,即由菜单项和菜单组成的对象树.可以将它视为一个整体.任何一个菜单都可能是组合,因为它即可能包含组合,也可能包含菜单项(并未持有其他对象),通过组合设计模式可以让我们使出简单的代码,就能够对整个菜单结构应用相同的操作.
下面的例子中,组合对象为Classes,叶节点对象为Student,通过对于根节点对象直接调用print方法,打印出对象树的所有信息.
//组件项目和组合共同的父类 public abstract class Model { /*将菜单和菜单项共同的方法提取出来*/ public String getName() { throw new UnsupportedOperationException(); } /*addModel是在组合中添加叶结点的方法,叶节点不需重写*/ public void addModel(Model model) { throw new UnsupportedOperationException(); } /*组合和叶结点共有的打印方法*/ public void print() { throw new UnsupportedOperationException(); } public String getDesription() { throw new UnsupportedOperationException(); } public int getMathMark() { throw new UnsupportedOperationException(); } public int getEnglishMark() { throw new UnsupportedOperationException(); } }
import java.util.ArrayList; import java.util.Iterator; //组合类 public class Classes extends Model{ String name; String description; ArrayList<Model> al=new ArrayList<Model>(); //存储叶结点对象的ArrayList public Classes(String name, String description) { super(); this.name = name; this.description = description; } @Override public String getName() { return name; } @Override public void addModel(Model model) { al.add(model); } @Override public String getDesription() { return description; } @Override public void print() { System.out.println("----------------------------"); System.out.println(name+":"+description); System.out.println("-------------------------------"); Iterator<Model> it=al.iterator(); while(it.hasNext()) { Model model=it.next(); model.print(); } } }
//叶节点类 public class Student extends Model{ private int mathMark; private int englishMark; private String name; public Student(String name,int mathMark, int englishMark) { super(); this.mathMark = mathMark; this.englishMark = englishMark; this.name = name; } public int getMathMark() { return mathMark; } public int getEnglishMark() { return englishMark; } public String getName() { return name; } @Override public void print() { System.out.println(name+":"+"Math:"+mathMark+",English:"+englishMark); } }
public class Drive { public static void main(String[] args) { Model stu1=new Student("Tom",92,93);//叶节点对象 Model stu2=new Student("Amy",90,87); Model stu3=new Student("Disk",88,85); Model stu4=new Student("Bob",98,95); Model stu5=new Student("Mary",90,90); Model classOne=new Classes("classOne","Teacher:Sam");//组合对象 Model classTwo=new Classes("classTwo","Teacher:Jerry"); Model grade=new Classes("ALLCLASS","Manager:xxx");//根节点 classOne.addModel(stu1); classOne.addModel(stu2); classOne.addModel(stu3); classTwo.addModel(stu4); classTwo.addModel(stu5); grade.addModel(classOne); grade.addModel(classTwo); grade.print(); //打印对象树的所有方法. } }