概念
組合模式(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:59】 2022-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:70】 2022-06-24 01:13:20.180 INFO Cars{name='寶馬', type='car_BMW', colour='yellow', cars=[]} 【http-nio-8081-exec-1】【DesignController:72】 2022-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:70】 2022-06-24 01:13:20.181 INFO Cars{name='捷安特', type='bicycle_giant', colour='blue', cars=[]} 【http-nio-8081-exec-1】【DesignController:72】 2022-06-24 01:13:20.181 INFO DesignController--- composite --end-- 【http-nio-8081-exec-1】【DesignController:76】