徒手擼設計模式-組合模式

hikoukay發表於2022-06-24

概念

組合模式(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】

 

 

 

相關文章