设计模式整理_组合模式

  组合模式允许你将对象组成树形结构,来表现整体和部分的联系.组合能让客户以一致的方式处理个别对象和对象的组合.

  组合模式将整体称为组合.(类似于树结构中的树),将组合下面没有其他元素相连的物件称为叶结点.其中,组合和叶结点有着共同的父类,可以将两者所有的方法抽象到父类中,并且对方法有默认的实现,这样如果叶结点或者组合不想实现某个方法的时候,就可以不实现方法.通过将菜单和项放在相同的结构中,我们创建了一个整体/部分的层次结构,即由菜单项和菜单组成的对象树.可以将它视为一个整体.任何一个菜单都可能是组合,因为它即可能包含组合,也可能包含菜单项(并未持有其他对象),通过组合设计模式可以让我们使出简单的代码,就能够对整个菜单结构应用相同的操作.

  下面的例子中,组合对象为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();        //打印对象树的所有方法.
    }
}

 

posted @ 2016-06-25 20:07  hlhdidi  阅读(198)  评论(0编辑  收藏  举报