设计模式-组合模式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();
        });
    }
}
相关推荐
BD_Marathon8 小时前
设计模式——合成复用原则
设计模式·合成复用原则
书院门前细致的苹果18 小时前
设计模式大全:单例、工厂模式、策略模式、责任链模式
设计模式·责任链模式·策略模式
BD_Marathon1 天前
设计模式——依赖倒转原则
java·开发语言·设计模式
BD_Marathon1 天前
设计模式——里氏替换原则
java·设计模式·里氏替换原则
jmxwzy1 天前
设计模式总结
设计模式
J_liaty2 天前
23种设计模式一代理模式
设计模式·代理模式
苏渡苇2 天前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日2 天前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.2 天前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon2 天前
七大设计原则介绍
设计模式