设计模式-组合模式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();
        });
    }
}
相关推荐
东方小月1 小时前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
程序员贺加贝3 小时前
轻制造SaaS的生产闭环建模-BOM工单领料报工质检与入库
java·设计模式·架构
嘟嘟07175 小时前
SDD 规范驱动开发:从 vibe coding 崩盘到"两次创造"
设计模式·代码规范·vibecoding
无凭7 小时前
拆解 DeerFlow Memory:Agent 的长期记忆到底怎么做?
人工智能·设计模式
AI大法师9 小时前
品牌焕新不只换 Logo:捷豹案例里的触点重构方法
大数据·人工智能·设计模式·新媒体运营
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-23-桥接模式(源码剖析篇)
java·设计模式·jdbc·桥接模式·源码分析·awt·java logging
嘟嘟07171 天前
TypeScript 工具类型通关:Pick、Omit、Partial、Record 区别与 Omit 等价实现一次讲清
设计模式·面试·typescript
SL_staff2 天前
中小离散制造如何用工艺路线模板解决‘人走流程丢’——JVS-APS 实践解析
java·设计模式·全栈
Asize2 天前
3 种设计模式 + DI:Nest.js 后端第一课
后端·设计模式·nestjs
St_rive2 天前
Page Object设计模式
java·开发语言·设计模式