徒手擼設計模式-裝飾器模式

2022-06-25 06:00:47

概念

裝飾器模式(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:132022-06-25 01:05:47.316 INFO  生產汽車 【http-nio-8081-exec-7】【Car:132022-06-25 01:05:47.317 INFO  生產汽車 【http-nio-8081-exec-7】【Car:132022-06-25 01:05:47.326 INFO  生產自行車 【http-nio-8081-exec-7】【Bicycle:132022-06-25 01:05:47.328 INFO  生產自行車 【http-nio-8081-exec-7】【Bicycle:132022-06-25 01:05:47.328 INFO  生產汽車 【http-nio-8081-exec-7】【Car:132022-06-25 01:05:47.328 INFO  生產汽車 【http-nio-8081-exec-7】【Car:132022-06-25 01:05:47.329 INFO  生產自行車 【http-nio-8081-exec-7】【Bicycle:132022-06-25 01:05:47.329 INFO  生產自行車 【http-nio-8081-exec-7】【Bicycle:13】