设计模式-组合模式Composite(结构型)

组合模式(Composite)

组合模式是一种结构型模式,它可以将对象组合成树状结构,用来区分部分和整体的层次机构,又叫部分整体模式

角色

  1. 组件:组合中所有对象的通用接口,可以是抽象类或者接口,声明管理子组件的方法,通常包括新增、删除、获取等方法
  2. 叶子节点:表示组合叶子节点对象,它没有子节点,实现组件的方法,但不包括子组件
  3. 复合节点:表示组件中的符合对象,实现组件方法,它可以包含子组件,也可是叶子节点
  4. 客户端:通过组合接口与组合结构交互,不区分叶子节点和复合节点,可以一致的对待整体与部分

案例

将书作为叶子节点,将目录作为符合节点

java 复制代码
public interface Component {
    void add(Component component);
    void remove(Component component);
    Component get();
    void plant();
}

public class Book implements Component{
    private String id;
    private String name;
    private Integer price;

    public Book(String id, String name, Integer price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    @Override
    public void add(Component component) {
        throw new RuntimeException("非目录,不支持add操作");
    }

    @Override
    public void remove(Component component) {
        throw new RuntimeException("非目录,不支持remove操作");
    }

    @Override
    public Component get() {
        return this;
    }
    
    /** 书只打印名字和价格*/
    @Override
    public void plant() {
        System.out.println("  " + name +"(" + price +")");
    }

}

public class Catalogue implements Component{
    private String id;
    private String name;
    private List<Component> items;
    private int root;

    public Catalogue(String id, String name, List<Component> items, int root) {
        this.id = id;
        this.name = name;
        this.items = items;
        this.root = root;
    }

    @Override
    public void add(Component component) {
        this.items.add(component);
    }

    @Override
    public void remove(Component component) {
        this.items.remove(component);
    }

    @Override
    public Component get() {
        return this;
    }

    /** 目录打印所有书和子目录,用root记录目录层次*/
    @Override
    public void plant() {
        System.out.println("--" + name);
        this.items.forEach(a -> {
            for (int i = 0; i < root; i++) {
                System.out.print("  ");
            }
            a.plant();
        });
    }
}
相关推荐
蜡笔小新..8 小时前
【设计模式】软件设计原则——开闭原则&里氏替换&单一职责
java·设计模式·开闭原则·单一职责原则
性感博主在线瞎搞9 小时前
【面向对象】设计模式概念和分类
设计模式·面向对象·中级软件设计师·设计方法
lucifer3119 小时前
JavaScript 中的组合模式(十)
javascript·设计模式
lucifer3119 小时前
JavaScript 中的装饰器模式(十一)
javascript·设计模式
蜡笔小新..10 小时前
【设计模式】软件设计原则——依赖倒置&合成复用
设计模式·依赖倒置原则·合成复用原则
刷帅耍帅10 小时前
设计模式-代理模式
设计模式·代理模式
神的孩子都在歌唱17 小时前
行为设计模式 -观察者模式- JAVA
java·观察者模式·设计模式
刷帅耍帅1 天前
设计模式-解释器模式
设计模式·解释器模式
刷帅耍帅1 天前
设计模式-备忘录模式
设计模式·备忘录模式