zoukankan      html  css  js  c++  java
  • 设计模式--组合模式Composite(结构型)

    一、概念

    组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

    二、UML图

    1.Component(对象接口),定义了对象可以做的事情。

    2.Leaf(叶子结点对象)

    3.Composite(其他结点对象,包含其他结点或者叶子节点)

    三、例子

    快递公司一般都有层级结构

    /**
     * 顺丰公司抽象类
     * 定义了公司可以做哪些事情
     * @author eason
     *
     */
    public abstract class SFCompany {
        
        //公司名
        protected String name;
        //公司级别
        protected int grade;
        
        public SFCompany(String name, int grade) {
            this.name = name;
            this.grade = grade;
        }
        
        //添加一个下属公司
        public abstract void add(SFCompany sf);
        //删除一个下属公司
        public abstract void remove(SFCompany sf);
        //打印自己
        public void display() {
            for(int i=1; i<=grade; i++) {
                System.out.print("-----");
            }
            System.out.println(name);
        }
        
    }
    
    
    /**
     * 最下层的公司
     * @author eason
     *
     */
    public class SFTailCompany extends SFCompany{
        
        public SFTailCompany(String name, int grade) {
            super(name, grade);
        }
    
        @Override
        public void add(SFCompany sf) {
            throw new UnsupportedOperationException();
        }
    
        @Override
        public void remove(SFCompany sf) {
            throw new UnsupportedOperationException();
        }
        
    //  已经提到父类中
    //    @Override
    //    public void display() {
    //        for(int i=1; i<=grade; i++) {
    //            System.out.print("-----");
    //        }
    //        System.out.println(name);
    //    }
    }
    
    
    /**
     * 有下属公司的顺丰公司
     * @author eason
     *
     */
    public class SFHeadCompany extends SFCompany{
        //保存下属公司
        private List<SFCompany> sfCompanys = new ArrayList<SFCompany>();
        
        public SFHeadCompany(String name, int grade) {
            super(name, grade);
        }
    
        @Override
        public void add(SFCompany sf) {
            sfCompanys.add(sf);
        }
    
        @Override
        public void remove(SFCompany sf) {
            sfCompanys.remove(sf);
        }
    
        //先打印自己,在打印自己的下属
        @Override
        public void display() {
    //  已经提到父类中,用super.display();代替
    //        for(int i=1; i<=grade; i++) {
    //            System.out.print("-----");
    //        }
    //        System.out.println(name);
            super.display();
            for(SFCompany sf : sfCompanys) {
                sf.display();
            }
        }
    
    }
    
    
    /**
     * 测试类
     * @author eason
     *
     */
    public class TestCompostite {
    
        public static void main(String[] args) {
            SFCompany head = new SFHeadCompany("总公司", 1);
            SFCompany shenzhen = new SFHeadCompany("深圳分公司", 2);
            SFCompany wuhan = new SFHeadCompany("武汉分公司", 2);
            SFCompany beijing = new SFHeadCompany("北京分公司", 2);
            SFCompany wuchang = new SFHeadCompany("武昌分公司", 3);
            SFCompany baoan = new SFHeadCompany("宝安分公司", 3);
            SFCompany luohu = new SFHeadCompany("罗湖分公司", 3);
            SFCompany nanshan = new SFHeadCompany("南山分公司", 3);
            
            head.add(shenzhen);
            head.add(wuhan);
            head.add(beijing);
            
            wuhan.add(wuchang);
            
            shenzhen.add(baoan);
            shenzhen.add(luohu);
            shenzhen.add(nanshan);
            //移除武汉
            //head.remove(wuhan);
            
            head.display();
            
        }
    
    }

    四、使用场景

    1.需求中体现的是整体和部分的层次关系,以及用户希望忽略整体与部分的不同,统一的使用整体对象和部分对象时,就应该考虑组合模式。

    2.组合模式让你可以优化处理递归或分级数据结构。如文件系统结构。

  • 相关阅读:
    C++多线程二
    C++多线程一
    定义抽象数据类型
    泛型函数
    关联容器(map):支持高效查找的容器,一种键值对的集合。
    字符串拆成单词的另一种实现
    将字符串拆成单词,并算最长的长度
    重载,排序,集合实例
    程序调用动态链接库中的方法,位图,类
    用bosybox制作文件系统
  • 原文地址:https://www.cnblogs.com/justkong/p/6229655.html
Copyright © 2011-2022 走看看