• 设计模式整理_组合模式


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

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

      下面的例子中,组合对象为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();        //打印对象树的所有方法.
        }
    }
  • 相关阅读:
    M、V、VM分别代表什么?
    HTML行内元素、块状元素、行内块状元素的区别
    野指针与僵尸对象
    mybatis 引入java 常量
    mybatis 分页默认500条
    java 引用
    java 查看类大小
    java 排序多个条件
    java for循环批次处理
    Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/5616811.html
Copyright © 2020-2023  润新知