• 徒手撸设计模式组合模式


    概念

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

    这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

    我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。

    参考链接: https://www.runoob.com/design-pattern/composite-pattern.html

    代码案例

    只需要一个组合类-组装层级关系

    /**
     * 车子组合类
     */
    @Getter
    public class Cars {
        private String name;
        private String type;
        private String colour;
        private List<Cars> cars;
    
        public Cars(String name, String type, String colour) {
            this.name = name;
            this.type = type;
            this.colour = colour;
            cars= new ArrayList<>();
        }
    
        /**
         * 生产车子
         * @param car
         */
        public void addCar(Cars car){
            cars.add(car);
        }
    
        /**
         * 卖出车子
         * @param car
         */
        public void removeCar(Cars car){
            cars.remove(car);
        }
    
        /**
         * 现有车子
         * @return
         */
        public List<Cars> getCars(){
            return cars;
        }
    
        @Override
        public String toString() {
            return "Cars{" +
                    "name='" + name + '\'' +
                    ", type='" + type + '\'' +
                    ", colour='" + colour + '\'' +
                    ", cars=" + cars +
                    '}';
        }
    }

    测试主类

    /**
     * 设计模式控制器
     */
    @RestController
    @RequestMapping("/designPattern")
    @Slf4j
    public class DesignController {
    
        /**
        *进行组合
        *顶层是车子统称
        *车子下分为自行车和汽车
        *自行车又包含捷安特自行车,汽车包含宝马车
        *因为根据索引取得车子,所以入参顺序要一致,也可以根据类型获取
        */
        @PostMapping("/composite")
        public ResponseModel composite(@RequestBody List<com.koukay.student.design.composite.Cars> cars) {
            log.info("DesignController--- composite --start--");
            com.koukay.student.design.composite.Cars topCars = cars.get(0);
            com.koukay.student.design.composite.Cars car = cars.get(1);
            com.koukay.student.design.composite.Cars bicycle = cars.get(2);
            com.koukay.student.design.composite.Cars carBmw = cars.get(3);
            com.koukay.student.design.composite.Cars bicycleGiant = cars.get(4);
            topCars.addCar(car);
            topCars.addCar(bicycle);
            car.addCar(carBmw);
            bicycle.addCar(bicycleGiant);
            for (com.koukay.student.design.composite.Cars topCarsCar : topCars.getCars()) {
                log.info(topCarsCar.toString());
                for (com.koukay.student.design.composite.Cars topCarsCarCar : topCarsCar.getCars()) {
                    log.info(topCarsCarCar.toString());
                }
    
            }
            log.info("DesignController--- composite --end--");
            return new ResponseModel("组合模式完成", 200, topCars);
        }
    }

    测试案例

    2022-06-24 01:13:16.940 INFO  DesignController--- composite --start-- 【http-nio-8081-exec-1】【DesignController:592022-06-24 01:13:20.179 INFO  Cars{name='汽车', type='car', colour='blue', cars=[Cars{name='宝马', type='car_BMW', colour='yellow', cars=[]}]} 【http-nio-8081-exec-1】【DesignController:702022-06-24 01:13:20.180 INFO  Cars{name='宝马', type='car_BMW', colour='yellow', cars=[]} 【http-nio-8081-exec-1】【DesignController:722022-06-24 01:13:20.180 INFO  Cars{name='自行车', type='bicycle', colour='white', cars=[Cars{name='捷安特', type='bicycle_giant', colour='blue', cars=[]}]} 【http-nio-8081-exec-1】【DesignController:702022-06-24 01:13:20.181 INFO  Cars{name='捷安特', type='bicycle_giant', colour='blue', cars=[]} 【http-nio-8081-exec-1】【DesignController:722022-06-24 01:13:20.181 INFO  DesignController--- composite --end-- 【http-nio-8081-exec-1】【DesignController:76】

     

     

  • 相关阅读:
    空间换时间之反范式设计之路/合理冗余/去除外键
    WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证
    开放api接口签名验证
    EasyUI开发踩过的坑(EasyUI开发笔记)
    nuget挂了吗?
    C# 实体/集合差异比较,比较两个实体或集合值是否一样,将实体2的值动态赋值给实体1(名称一样的属性进行赋值)
    从应用的角度讲创业公司该如何选择域名?
    疑似easyui本身bug:easyui时间控件问题,试了几个版本都不行
    工作三年对程序的理解特来求证
    控制器读取视图表单中的数据的几种方式
  • 原文地址:https://www.cnblogs.com/hikoukay/p/16407353.html
Copyright © 2020-2023  润新知