裝飾器模式(Decorator Pattern)允許向一個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的範例來演示裝飾器模式的用法。其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類。
參考連結: https://www.runoob.com/design-pattern/decorator-pattern.html
/** * 生產車子介面 */ public interface Cars { String product(); }
/** * 生產自行車 */ @Slf4j public class Bicycle implements Cars { @Override public String product() { log.info("生產自行車"); return "自行車"; } }
/** * 生產汽車 */ @Slf4j public class Car implements Cars { @Override public String product() { log.info("生產汽車"); return "汽車"; } }
/** * 車子裝飾類 */ @Slf4j public abstract class CarsDecorator implements Cars { protected Cars decoratorCars; public CarsDecorator(Cars decoratorCars) { this.decoratorCars = decoratorCars; } @Override public String product() { return decoratorCars.product(); } }
/** * 土豪金色車子裝飾器 */ public class GoldenCarsDecorator extends CarsDecorator { public GoldenCarsDecorator(Cars decoratorCars) { super(decoratorCars); } @Override public String product() { String product = decoratorCars.product(); return setColour(decoratorCars)+"----"+product; } public String setColour(Cars decoratorCars){ decoratorCars.product(); return "土豪金色"; } }
/** * 設計模式控制器 */ @RestController @RequestMapping("/designPattern") @Slf4j public class DesignController { @GetMapping("/decorator") public ResponseModel decorator() { com.koukay.student.design.decorator.Cars bicycle= new com.koukay.student.design.decorator.impl.Bicycle(); CarsDecorator cdCar = new GoldenCarsDecorator(new com.koukay.student.design.decorator.impl.Car()); CarsDecorator cdBicycle = new GoldenCarsDecorator(new com.koukay.student.design.decorator.impl.Bicycle()); com.koukay.student.design.decorator.Cars cdCarCars = new GoldenCarsDecorator(new com.koukay.student.design.decorator.impl.Car()); com.koukay.student.design.decorator.Cars cdBicycleCars = new GoldenCarsDecorator(new com.koukay.student.design.decorator.impl.Bicycle()); String bicyclePS = bicycle.product(); String CarD = cdCar.product(); String bicycleD = cdBicycle.product(); String carP = cdCarCars.product(); String bicycleP = cdBicycleCars.product(); LinkedHashMap map= new LinkedHashMap(); map.put("bicyclePS",bicyclePS); map.put("CarD",CarD); map.put("bicycleD",bicycleD); map.put("carP",carP); map.put("bicycleP",bicycleP); return new ResponseModel("裝飾器模式完成", 200, map); } }
2022-06-25 01:05:47.315 INFO 生產自行車 【http-nio-8081-exec-7】【Bicycle:13】 2022-06-25 01:05:47.316 INFO 生產汽車 【http-nio-8081-exec-7】【Car:13】 2022-06-25 01:05:47.317 INFO 生產汽車 【http-nio-8081-exec-7】【Car:13】 2022-06-25 01:05:47.326 INFO 生產自行車 【http-nio-8081-exec-7】【Bicycle:13】 2022-06-25 01:05:47.328 INFO 生產自行車 【http-nio-8081-exec-7】【Bicycle:13】 2022-06-25 01:05:47.328 INFO 生產汽車 【http-nio-8081-exec-7】【Car:13】 2022-06-25 01:05:47.328 INFO 生產汽車 【http-nio-8081-exec-7】【Car:13】 2022-06-25 01:05:47.329 INFO 生產自行車 【http-nio-8081-exec-7】【Bicycle:13】 2022-06-25 01:05:47.329 INFO 生產自行車 【http-nio-8081-exec-7】【Bicycle:13】