组合模式

一、定义

组合模式(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);

    }
}

posted @ 2020-01-21 02:04  兮云飞扬  阅读(90)  评论(0编辑  收藏  举报