設計模式-裝飾模式(Decorator Pattern)

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(動態地給一個對象添加一些額外的職責。就增長功能來講,裝飾模式相比生成子類更爲靈活。)

裝飾模式有四個角色:
1.Component抽象構件
Component是一個接口或者是抽象類,就是定義咱們最核心的對象,也就是最原始的對
象。
2.ConcreteComponent 具體構件
ConcreteComponent是最核心、最原始、最基本的接口或抽象類的實現,你要裝飾的就是
它。
3.Decorator裝飾角色
通常是一個抽象類,作什麼用呢?實現接口或者抽象方法,它裏面可不必定有抽象的方
法呀,在它的屬性裏必然有一個private變量指向Component抽象構件。
4.具體裝飾角色
ConcreteDecoratorA和ConcreteDecoratorB是兩個具體的裝飾類,你要把你最核心的、最
原始的、最基本的東西裝飾成其餘東西。java

具體請看例子:
Caride

/** * @author shuliangzhao * @Title: Car * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:26 */ public abstract class Car { public abstract void driver(); } 

AudiCarflex

/** * @author shuliangzhao * @Title: AudiCar * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:27 */ public class AudiCar extends Car { @Override public void driver() { System.out.println("速度爲每小時50KM"); } } 

DecoratorCarthis

/** * @author shuliangzhao * @Title: DecoratorCar * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:28 */ public abstract class DecoratorCar extends Car{ private Car car; public DecoratorCar(Car car) { this.car = car; } @Override public void driver() { car.driver(); } } 

BlueAudiCarspa

/** * @author shuliangzhao * @Title: BlueAudiCar * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:31 */ public class BlueAudiCar extends DecoratorCar { public BlueAudiCar(Car car) { super(car); } @Override public void driver() { this.color(); super.driver(); } private void color() { System.out.println("藍色奧迪車"); } } 
/** * @author shuliangzhao * @Title: BmwCar * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:30 */ public class RedAudiCar extends DecoratorCar { public RedAudiCar(Car car) { super(car); } @Override public void driver() { this.color(); super.driver(); } private void color() { System.out.println("紅色奧迪車"); } } 

客戶端code

/** * @author shuliangzhao * @Title: Client * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:32 */ public class Client { public static void main(String[] args) { Car car = new AudiCar(); car.driver(); Car redCar = new RedAudiCar(car) ; redCar.driver(); Car blueCar = new BlueAudiCar(car); blueCar.driver(); } } 

運行結果orm

 

 
image.png

裝飾模式優勢:

1.裝飾類和被裝飾類能夠獨立發展,而不會相互耦合。
2.裝飾模式是繼承關係的一個替代方案。
3.能夠動態擴展類。對象

裝飾模式缺點:

多層的裝飾是比較複雜。繼承

裝飾模式使用場景:

須要動態地給一個對象增長功能、須要擴展一個類的功能。接口

舉個簡單例子能夠看出裝飾模式的好處:三個繼承關係Father、Son、GrandSon三個類,我要在Son類上加強一些功能怎麼辦?我想你會堅定地頂回去!不容許,對了,爲何呢?你加強的功能是修改Son類中的方法嗎?增長方法嗎?對GrandSon的影響呢?特別是GrandSon有多個的狀況,你會怎麼辦?這個評估的工做量就夠你受的,因此這是不容許的,那仍是要解決問題的呀,怎麼辦?經過創建SonDecorator類來修飾Son,至關於建立了一個新的類,這個對原有程序沒有變動,經過擴展很好地完成了此次變動。

注意:繼承是靜態地給類增長功能,而裝飾模式則是動態地增長功能。

相關文章
相關標籤/搜索