zoukankan      html  css  js  c++  java
  • 组合模式

    一、定义

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

    二、优缺点

    优点:组合模式可以让客户端一致的使用组合结构和单个对象。当需求是体现部分与整体层次的结构时,以及希望可以忽略组合对象和单个对象的不同,统一使用组合中的所有对象时,就可以用组合模式。

    缺点:创建枝节点和子节点都是使用实现类,违背了依赖倒置原则。

    三、示例代码

    /*所有实现类的共有接口,用于访问和管理子部件*/
    public abstract class Component {
    
        protected String name;
    
        public Component(String name) {
            this.name = name;
        }
        public abstract void add(Component component);
        public abstract void remove(Component component);
        public abstract void display(int depth);
    
    }
    /*枝节点*/
    public class Composite extends Component {
        private List<Component> children = new ArrayList<>();
    
        public Composite(String name) {
            super(name);
        }
    
    
        @Override
        public void add(Component component) {
            children.add(component);
        }
    
        @Override
        public void remove(Component component) {
            children.remove(component);
        }
    
        @Override
        public void display(int depth) {
    
            StringBuilder stringBuilder=new StringBuilder();
            for (int i = 0; i <depth ; i++) {
                stringBuilder.append("-");
            }
            System.out.println( stringBuilder.append(name));
            for (Component component : children
            ) {
                component.display(depth + 1);
            }
        }
    }
    /*叶节点*/
    public class Leaf extends Component {
    
        public Leaf(String name) {
            super(name);
        }
    
        @Override
        public void add(Component component) {
    
        }
    
        @Override
        public void remove(Component component) {
    
        }
    
        @Override
        public void display(int depth) {
            StringBuilder stringBuilder=new StringBuilder();
            for (int i = 0; i <depth ; i++) {
                stringBuilder.append("-");
            }
            System.out.println( stringBuilder.append(name));
        }
    }
    /*客户端类*/
    public class Client {
        public static void main(String[] args) {
            Composite root = new Composite("root");
            root.add(new Leaf("Leaf A"));
            root.add(new Leaf("Leaf B"));
    
            Composite composite = new Composite("Composite X");
            composite.add(new Leaf("Leaf XA"));
            composite.add(new Leaf("Leaf XB"));
            root.add(composite);
    
            Composite composite2 = new Composite("Composite Y");
            composite2.add(new Leaf("Leaf YA"));
            composite2.add(new Leaf("Leaf YB"));
            composite.add(composite2);
            root.add(new Leaf("Leaf C"));
            root.display(1);
    
        }
    }
    
    
  • 相关阅读:
    Flex AIR应用GPS定位功能(Android和IOS)
    Flex AIR应用拍照功能(Android和IOS版本)
    读取Flex AIR应用程序设置
    查看本机开放的端口号,查看某个端口号是否被占用,查看被占用的端口号被哪个进程所占用,如何结束该进程
    Eclipse设置默认编码为UTF-8
    Eclipse使用教程之精华篇
    hdu 1829 分组并查集
    hdu 1316高精度
    hdu 4287 字典树问题
    hdu 1867 kmp共工前后缀串问题
  • 原文地址:https://www.cnblogs.com/yfy-/p/12220119.html
Copyright © 2011-2022 走看看