技术栈

2019-02-28——设计模式 组合模式

2019-02-28  本文已影响0人  烟雨乱平生

特点

将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。

主要角色

分类

实现

透明模式

public interface Component {
    void addChild(Component child);
    void removeChild(int index);
    Component getChild(int index);
    void show();
}


public class Composite implements Component {
    private List<Component> children = new ArrayList<>();
    @Override
    public void show() {
        for (Component child:children){
            child.show();
        }
    }

    public void addChild(Component child){
        this.children.add(child);
    }

    public void removeChild(int index){
        this.children.remove(index);
    }

    public Component getChild(int index){
        return this.children.get(index);
    }
}


@AllArgsConstructor
public class Leaf implements Component {
    private String name;
    @Override
    public void show() {
        System.out.println(name);
    }

    @Override
    public void addChild(Component child) {    }

    @Override
    public void removeChild(int index) {    }

    @Override
    public Component getChild(int index) {
        return null;
    }
}

安全模式

public interface Component {
    void show();
}


public class Composite implements Component {
    private List<Component> children = new ArrayList<>();
    @Override
    public void show() {
        for (Component child:children){
            child.show();
        }
    }

    public void addChild(Component child){
        this.children.add(child);
    }

    public void removeChild(int index){
        this.children.remove(index);
    }

    public Component getChild(int index){
        return this.children.get(index);
    }
}


@AllArgsConstructor
public class Leaf implements Component {
    private String name;
    @Override
    public void show() {
        System.out.println(name);
    }
}

透明模式和安全模式的区别在于对于节点的操作是否在抽象构件中体现出来。如果体现,那么调用方就无需感知当前节点是叶子节点还是树枝节点,但是会引发安全错误;如果不体现,那么调用放就需感知当前节点是叶子节点还是树枝节点,但是不会引发安全错误

上一篇 下一篇

猜你喜欢

热点阅读