【設計模式】之裝飾器模式

裝飾器設計模式的概念

在實際生產中,某個類的行爲(它所提供的方法)已經無法知足當前的須要了,可是又須要使用原有的部分功能,所以須要對原有對象進行加強——裝飾器設計模式(Decorator Pattern)也叫包裝器模式就是爲解決此問題而誕生的,它是對原有類的一個包裝,屬於結構性設計模式。java

裝飾器模式在不改變現有類方法簽名的前提下,對當前的類進行了加強。git

Tips

咱們使用繼承也能夠實現,可是會致使類型結構的膨脹,難以維護。github

裝飾器設計模式的生活場景

咱們來看一個現實中的例子,老李頭家大兒子去年談了個朋友,女方要求有車才能領證,因此老李家買了一輛奇瑞eQ1,可是女方嫌車速太慢喜歡開快車的感受...如今老李家正苦惱中...直到有一天在市裏工做的大表哥回來據說該狀況後,大表哥說這個好整啊,搞到車行去改裝一下,把速度提上去就能夠了啊。設計模式

因而乎,老李家去車行把車進行了改裝,車速上去了,媳婦也領到了,皆大歡喜...架構

這其實就是一個裝飾器的使用案例,原來的eQ1車已經無法知足了,因此進行了速度加強,其餘功能並無改變。app

裝飾器設計模式的特徵

  • 被加強類、加強類實現同一個接口
  • 加強類持有被加強類的引用
  • 被加強的方法調用加強類的方法,其餘方法保持原有的繼續使用被加強類的舊方法

裝飾器模式的設計

  • 編寫一個接口Car
  • 被加強類 QeqCar 實現 Car接口
  • 加強類 Wrapper 實現 Car接口
  • 加強類 Wrapper持有被加強類 QeqCar 的引用

類圖

image.png

裝飾器設計模式的實現

  • Car.java
public interface Car {
    void run();

    void stop();
}
  • QeqCar.java
public class QeqCar implements Car {
    @Override
    public void run() {
        System.out.println("Qeq go...");
    }

    @Override
    public void stop() {
        System.out.println("Qeq stop!");
    }
}
  • WrapperCar.java
public class WrapperCar implements Car {

    private Car car;

    public WrapperCar(Car car) {
        this.car = car;
    }

    @Override
    public void run() {
        System.out.println("wapper run...");
    }

    @Override
    public void stop() {
        car.stop();
    }
}
  • WrapperTest .java
public class WrapperTest {

    @Test
    public void 裝飾器模式測試(){
        Car car = new WrapperCar(new QeqCar());
        car.run();
        car.stop();
    }

}

測試輸出:ide

wapper run...
Qeq stop!
更多關於設計模式的資料請參考: JAVA高級架構師技術棧
相關文章
相關標籤/搜索