『设计模式』小伙你的穿搭很潮!--装饰者模式
生活随笔
收集整理的這篇文章主要介紹了
『设计模式』小伙你的穿搭很潮!--装饰者模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
23種設計模式+額外常用設計模式匯總 (持續更新)
裝飾模式(Decorator):又名包裝模式。裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案。
裝飾模式常常被稱為包裹模式,就是因為每一個具體裝飾類都將下一個具體裝飾類或者具體構成類包裹起來。
包含角色
- 抽象構成(Component)角色
給出一個抽象接口,以規范準備接收附加責任的對象。 - 具體構成(Concrete Component)角色
實現組件對象接口,通常就是被裝飾器裝飾的對象。 - 裝飾(Decorator)角色
持有一個構件(Component)對象的實例,并定義一個與抽象構件接口一致的接口。 - 具體裝飾(Concrete Decorator)角色
負責給構件對象“貼上”附加的責任
特點
- 裝飾模式為對象添加額外責任的方式就像做蛋糕一樣,一圈一圈的加上去,中間的面包是核心,是被裝飾的對象,是核心任務,外圍的都是裝飾對象。
- 這就是說裝飾模式包含兩部分內容,即裝飾獨享和被裝飾對象。
- 按照GOF的說法,Decorator模式的意圖是:動態的給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。
- 這個被裝飾的對象不一定是最原始的那個對象,也可能是被其他裝飾器裝飾過的對象,反正都是實現的同一接口,也就是同一類型。
- Decorator模式的效果是:讓我們可以創建以decorator對象——負責新的功能的對象——開始的一條對象“鏈”,并接受與租出的對象。
Decorator鏈
Decorator1->Decorator2->Decorator3->Concrete Comp模式講解
功能
能夠實現動態地為對象添加功能,是從一個對象外部來給對象增加功能,相當一是改變了對象的外觀
對象組合
Favor Composition Over Inheritance
裝飾器和組件類的關系
裝飾器是用來裝飾組件類的關系,裝飾器一定要實現和組件類一致的接口,保證他們是同一個類型,并且具有同一個外觀這樣組合完成的裝飾才能夠遞歸調用下去。
本質
動態是手段,組合是目的
優點
- 裝飾模式與集成關系的目的都是要擴展對象的功能,但是裝飾模式可以提供比繼承更多的靈活性。
- 通過使用不同的具體裝飾類似以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。
缺點
會產生很多細粒度對象
裝飾模式與策略模式
- 策略模式改變的是對象的內核
- 裝飾模式改變的是對象的外殼
- 策略模式是一層調用
- 裝飾模式是遞歸調用
- 可以有機結合
裝飾模式與AOP
- APO(Aspect Qriented Programming)是OOP的延續,意思是面向方面編程。
- 面向對象開發中,烤爐系統的角度通常是縱向的。
- AOP的主要的功能是:日志記錄,性能統計,安全控制,事務處理,異常處理等等。
- 主要意圖是:將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務員邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將他們獨立到非知道業務邏輯的方法中,進而改變這些行業的時候不影響業務邏輯的代碼。
舉例
實現
//抽象構件(Component)角色 public abstract class Component {public abstract void operate();//具體構件(ConcreteComponent)角色,被包裝對象 public class ConcreteComponent extends Component {@Overridepublic void operate() {System.out.println("ConcreteComponent 原始對象操作");} } // 裝飾(Decorator)角色: public abstract class Decorator extends Component {private Component component;/*** 構造函數傳遞要裝飾的對象* @param component 被裝飾的對象*/public Decorator(Component component) {this.component = component;}@Overridepublic void operate() {//調用被裝飾者的方法this.component.operate();} }public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void operate() {super.operate();//調用自己的方法this.operateAMethod();}private void operateAMethod() {System.out.println("ConcreteDecoratorA添加的修飾方法");} }public class ConcreteDecoratorB extends Decorator {public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void operate() {//調用自己的方法this.operateBMethod();super.operate();}private void operateBMethod() {System.out.println("ConcreteDecoratorB添加的修飾方法");} }public class Client {public static void main(String[] args) {//創建原始對象Component component = new ConcreteComponent();//第一次裝飾component = new ConcreteDecoratorA(component);//第二次裝飾component = new ConcreteDecoratorB(component);//兩次裝飾后的操作component.operate();} }【問題】 一個人可以搭配不同的服飾:例如,大T恤,垮褲,破球鞋;或者,西裝,領帶,皮鞋。
【裝飾模式實現代碼】
【UML圖】
總結
以上是生活随笔為你收集整理的『设计模式』小伙你的穿搭很潮!--装饰者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: B2B、B2C、C2C市场是什么意思啊
- 下一篇: 华清实训的收获(人工智能的小广告和福利)