一、核心作用:
- 動態的爲一個對象增加新功能
- 裝飾模式是一種代理繼承是技術,無需通過繼承增加子類就可以擴展對象
- 使用對象關聯關係代理繼承關係,更加靈活,避免類型體系快速膨脹
- 裝飾模式降低系統的耦合度,可以動態的增加或刪除對象
- 使需要裝飾的具體構建類和具體修飾類可以獨立變化,以便增加新的具體構建類和具體裝飾類
二、常見應用場景:
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();
}
}
結果如下:
六、裝飾模式的優缺點:
優點:
擴展對象功能,比繼承靈活,不會導致類的數量急劇增加
可以對一個對象進行一個多次裝飾,創造出不同的行爲組合,得到更強大的功能
具體構建類的具體裝飾可以獨立變化,用戶根據自己需求去增加新的具體構建子類和具體裝飾子類
缺點:
產生很多小對象,大量小對象佔據內存,一定程度上影響性能。
裝飾模式易出錯,調試排查比較麻煩
七、裝飾模式與橋接模式的區別:
兩個模式均爲解決過多子類對象的問題,但是橋接模式是對象自身現有機制沿着多維度變化。裝飾模式是爲了增加新的功能。
感謝閱讀,水平有限,如有錯漏,還請不吝賜教