概念
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。
参考链接: 组合模式 | 菜鸟教程
代码案例
只需要一个组合类-组装层级关系
/**
* 车子组合类
*/
@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】