• 设计模式-组合模式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();
            });
        }
    }
    
  • 相关阅读:
    Kafka详解(一)
    qt学习之旅--QToolBar的使用(一)
    java毕业生设计医院住院综合服务管理系统计算机源码+系统+mysql+调试部署+lw
    华为机试 - 租车骑绿岛
    竞赛选题 基于深度学习的人脸识别系统
    String类_Java(一)
    Fast R-CNN
    apisix~lua插件开发与插件注册
    Temporal对比Cadence
    记一次rabbitmq生产者和消费者高可用的封装
  • 原文地址:https://blog.csdn.net/qq_43676797/article/details/139705865