美文网首页
第19章 分公司=一部门--组合模式

第19章 分公司=一部门--组合模式

作者: 落墨Zero | 来源:发表于2018-07-17 14:51 被阅读0次

    组合模式

    组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。[DP]

    组合模式结构图
    图片.png

    Component类,组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件

    public abstract class Component {
    
        protected String name;
        
        public Component(String name){
            this.name = name;
        }
    
        /**
         * 增加树枝
         * @param c
         */
        public abstract void add(Component c);
    
        /**
         * 移除树枝
         * @param c
         */
        public abstract void remove(Component c);
    
        public abstract void display(int depth);
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    Leaf在组合中表示叶节点对象,叶节点没有子节点

    public class Leaf extends Component {
    
        public Leaf(String name) {
            super(name);
        }
    
        /**
         * 由于叶子没有增加分支,所以add和remove方法没有意思,
         * 这样做可以消除叶节点和枝节点在抽象层次的区别
         * 它们具备完全一致的接口
         * @param c
         */
        @Override
        public void add(Component c) {
            print("cannot add to a leaf");
        }
    
        @Override
        public void remove(Component c) {
            print("cannot remove from a leaf");
        }
    
        /**
         * 显示名称和级别
         * @param depth
         */
        @Override
        public void display(int depth) {
            print(String.join("", Collections.nCopies(depth, "-")) + name);
        }
    }
    
    

    Composite定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作

    public class Composite extends Component {
    
        /**
         * 用来存储下属的枝节点和叶节点
         */
        private List<Component> children = new ArrayList<>();
    
        public Composite(String name) {
            super(name);
        }
    
        @Override
        public void add(Component c) {
            children.add(c);
        }
    
        @Override
        public void remove(Component c) {
            children.remove(c);
        }
    
        @Override
        public void display(int depth) {
            print(String.join("", Collections.nCopies(depth, "-")) + name);
            for(Component c : children){
                c.display(depth+2);
            }
        }
    }
    

    测试代码

    public class Test {
    
        public static void main(String[] args) {
            Composite root = new Composite("root");
            root.add(new Leaf("LeafA"));
            root.add(new Leaf("LeafB"));
    
            Composite composite1 = new Composite("CompositeX");
            composite1.add(new Leaf("LeafC"));
            composite1.add(new Leaf("LeafD"));
            root.add(composite1);
    
            Composite composite2 = new Composite("CompositeY");
            root.add(composite2);
    
            root.display(1);
        }
    
    }
    

    运行结果


    图片.png
    何时使用组合模式

    需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。

    组合模式好处

    组合模式定义了包含基本对象和组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象。
    组合模式让客户可以一致地使用组合结构和单个对象。

    相关文章

      网友评论

          本文标题:第19章 分公司=一部门--组合模式

          本文链接:https://www.haomeiwen.com/subject/aagwpftx.html