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


    组合模式(Composite)

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

    角色

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

    案例

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

    
    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();
            });
        }
    }
    
  • 相关阅读:
    电脑模拟写字板应用设计(Java+Swing+Eclipse)
    《代码整洁之道》读书笔记
    Golang Map 基本原理
    使用 gst-plugins-bad 里面的 gst-element-maker 工具创建gstreamer 插件
    配置文件和yaml语法
    ROS机械臂 Movelt 学习笔记4 | Move Group 接口 Python
    SpringBoot项目统一处理返回值和异常
    WPF 控件专题 ScrollBar控件详解
    【linux命令讲解大全】098.网络文件传输协议介绍及常用命令
    【C语言入门】ZZULIOJ 1036-1040
  • 原文地址:https://blog.csdn.net/qq_43676797/article/details/139705865