组合设计模式

概述

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
设计模式可以分为三大类,分别是创建型、结构型和行为型。

结构型

组合模式(composite)

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

结构图

image.png

应用场景

拥有部分和整体的场景,例如,文件和文件夹,树形菜单。

优点

高层代码调用简单;节点可以自由增加

缺点

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

代码

顶层接口

public abstract class Component {
    protected  String name;
    public Component(String name){
        this.name = name;
    }
    public abstract void add(Component c);
    public abstract void remove(Component c);
    public abstract void display(int depth);

}

叶子节点

public class Leaf extends Component{

    public Leaf(String name){
        super(name);
    }

    @Override
    public void add(Component c) {
        System.out.println("Cannot add a leaf");
    }

    @Override
    public void remove(Component c) {
        System.out.println("Cannot remove from a leaf");
    }

    @Override
    public void display(int depth) {
        String str = "";
        for (int i=0; i<depth; i++){
            str = str + "-";
        }
        System.out.println(str + name);
    }
}

节点 相当于枝干,可以存储更多节点

public class Composite extends Component{

    public Composite(String name){
        super(name);
    }
    private List<Component> children = new ArrayList<>();

    @Override
    public void add(Component c) {
        children.add(c);
    }

    @Override
    public void remove(Component c) {
        children.remove(c);
    }

    @Override
    public void display(int depth) {
        String str = "";
        for (int i=0; i<depth; i++){
            str = str + "-";
        }
        System.out.println(str + name);
        for (Component component : children){
            component.display(depth + 2);
        }
    }

主类测试

public class JavaDemo {
    public static void main(String[] args){
        Composite root = new Composite("root");
        root.add(new Leaf("Leaf A"));
        root.add(new Leaf("Leaf B"));

        Composite cmp = new Composite("Composite X");
        cmp.add(new Leaf("Leaf XA"));
        cmp.add(new Leaf("Leaf XB"));

        root.add(cmp);
        root.display(1);
    }
}

注:

本文参考了书籍《大话设计模式》和菜鸟教程设计模式相关部分资料

posted @ 2019-03-07 17:23  Duo17  阅读(179)  评论(0编辑  收藏  举报