GOF23之裝飾模式

一、核心作用:

  1. 動態的爲一個對象增加新功能
  2. 裝飾模式是一種代理繼承是技術,無需通過繼承增加子類就可以擴展對象
  3. 使用對象關聯關係代理繼承關係,更加靈活,避免類型體系快速膨脹
  4. 裝飾模式降低系統的耦合度,可以動態的增加或刪除對象
  5. 使需要裝飾的具體構建類和具體修飾類可以獨立變化,以便增加新的具體構建類和具體裝飾類

二、常見應用場景:

1、IO輸入流/IO輸出流
2、Servlet API reques對象

三、裝飾模式角色分類:

  • Component抽象構建:真實對象和裝飾對象有相同的接口,這樣客戶端對象就可以以與真實對象相同的方式同裝飾對象交互
  • ConcreteComponent具體構建角色(真實角色)
  • Decorator裝飾角色:持有一個抽象構建的引用,裝飾對象接受客戶端的請求,並把這些請求轉發給真實對象,這樣可以在真實對象調用前後增加新功能
  • ConcreteDecorator具體裝飾角色:負責給構建對象增加新的責任

在這裏插入圖片描述

四、IO流實現細節:

Component抽象構建:
	io流中的InputStream、OutputStream、Reader、Writer
ConcreteComponent 具體構建角色(真實角色):
	FileInputStream、FileOutputStream
Decorator裝飾角色:
	持有一個抽象構建的引用:FilterInputStream、FilterOutputStream
ConceteDecorator具體修飾角色:
	負責給構建對象增加新責任:BufferedOutputStream、BufferedInputStream

五、代碼示例:

一、Conponent抽象部件:
package com.hezeu.decorator;

/**
* @Classname ICar
* @Description 抽象構建
* @Date 2020/2/23 下午 06:01
* @Created by 朱進博 [email protected]
*/
public interface ICar {
        void move();
}

二、ConcreteConponent具體構建部件(真實角色):

/**
* 具體構建角色(真實對象)
*/
class Car implements ICar{

        @Override
        public void move() {
                System.out.println("在陸地上跑");
        }
}

三、Decorator裝飾角色:
/**
* 裝飾角色
*/
class SuperCar implements ICar{
        protected ICar car;

        public SuperCar(ICar car) {
                this.car = car;
        }

        @Override
        public void move() {
                car.move();
        }
}
四、ConcreteDecorator 具體修飾角色:
/**
* 具體修飾角色
*/
class FlyCar extends SuperCar{

        public FlyCar(ICar car) {
                super(car);
        }

        public void fly(){
                System.out.println("天上飛");
        }

        @Override
        public void move() {
                super.move();
                fly();
        }
}
四、Client類測試:
package com.hezeu.decorator;

/**
* @Classname Client
* @Description TODO
* @Date 2020/2/23 下午 06:15
* @Created by 朱進博 [email protected]
*/
public class Client {
        public static void main(String[] args) {
                Car car = new Car();
                car.move();

                System.out.println("------增加新功能天上飛---");
                SuperCar flycar = new FlyCar(car);
                flycar.move();

                System.out.println("------增加新功能天上飛水裏遊-----");
                SuperCar waterCar = new WaterCar(flycar);
                waterCar.move();
        }
}
結果如下:

在這裏插入圖片描述

六、裝飾模式的優缺點:

優點:
	 擴展對象功能,比繼承靈活,不會導致類的數量急劇增加
	 可以對一個對象進行一個多次裝飾,創造出不同的行爲組合,得到更強大的功能
	 具體構建類的具體裝飾可以獨立變化,用戶根據自己需求去增加新的具體構建子類和具體裝飾子類
缺點:
     產生很多小對象,大量小對象佔據內存,一定程度上影響性能。
	 裝飾模式易出錯,調試排查比較麻煩

七、裝飾模式與橋接模式的區別:

兩個模式均爲解決過多子類對象的問題,但是橋接模式是對象自身現有機制沿着多維度變化。裝飾模式是爲了增加新的功能。

感謝閱讀,水平有限,如有錯漏,還請不吝賜教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章