設計模式 (十)裝飾模式(Decorator)
裝飾模式(Decorator)就是使用被裝飾的一個子類的例項,在客戶端將這個子類的例項委託給裝飾類。裝飾模式是結成關係的一個替代方案。
簡單的裝飾模式是原理圖入下:
裝飾模式以對客服端透明的方式增添了物件的功能,其在與動態的給物件新增了責任,當然這裡的繼承便是靜態的。
其中重要的地方時裝飾物件和真是物件有相同的介面,這樣客戶端就可以和真是物件一樣的互動方式和裝飾物件互動,然後裝飾物件把所有從客戶端接收過來的請求全部轉發給真是物件,然後在返還給客戶端,這樣裝飾物件就可以再轉發前或者以後新增一些附加功能而不影響對真是物件的操作,這樣在不改變原有類的基礎想,可以實現對於原有類的這種額外功能的實現,增強了程式的複用性。
同時裝飾模式比繼承好的地方就是,裝飾模式可以動態的對已經存在的類進行任意的組合,實現想要的功能,而繼承是靜態的實現,不能改變原有類的實現,如果要新增更多的功能,只有新增更多的派生類來實現,這個簡潔在下面的例子裡對於最後一次列印輸出就有很明顯的效果,定義好了兩個裝飾類以後,不用再定義第三個就可以實現兩個裝飾類排列組合的效果。下面就簡單的做了一個通過對於手機接電話的一個擴充套件,接聽電話之前有一個彩鈴,接受電話之後會回撥一段廣告,這樣就出來了下面的例子:
- package com.designpattern.decorator;
- public interface Phone {
- public void recevieCall(String name);
- }
- package com.designpattern.decorator;
- public class ChinaMobile implements Phone {
- @Override
- public void recevieCall(String name) {
- System.out.println("step recevie " + name + " call");
- }
- }
- package com.designpattern.decorator;
- public abstract class Decorator implements Phone {
- private Phone phone;
- public Decorator(Phone phone) {
- this.phone = phone;
- }
- @Override
- public void recevieCall(String name) {
- this.phone.recevieCall(name);
- }
- }
- package com.designpattern.decorator;
- public class RingBeforeChinaMobileDecorator extends Decorator {
- public RingBeforeChinaMobileDecorator(Phone phone) {
- super(phone);
- }
- @Override
- public void recevieCall(String name) {
- System.out.println("step ring before recevie " + name + "call");
- super.recevieCall(name);
- }
- }
- package com.designpattern.decorator;
- public class AdAfterChinaMobileDecorator extends Decorator {
- public AdAfterChinaMobileDecorator(Phone phone) {
- super(phone);
- }
- @Override
- public void recevieCall(String name) {
- super.recevieCall(name);
- System.out.println("step ad after recevie " + name + " call");
- }
- }
- package com.designpattern.decorator;
- public class Client {
- public static void main(String[] args) {
- Phone phone = new ChinaMobile();
- Decorator decorator = new RingBeforeChinaMobileDecorator(phone);
- decorator.recevieCall("andimuise");
- System.out
- .println("**************************************************");
- decorator = new AdAfterChinaMobileDecorator(phone);
- decorator.recevieCall("halberd");
- System.out
- .println("**************************************************");
- decorator = new RingBeforeChinaMobileDecorator(
- new AdAfterChinaMobileDecorator(phone));
- decorator.recevieCall("teacher");
- System.out
- .println("**************************************************");
- }
- }
- step ring before recevie andimuisecall
- step recevie andimuise call
- **************************************************
- step recevie halberd call
- step ad after recevie halberd call
- **************************************************
- step ring before recevie teachercall
- step recevie teacher call
- step ad after recevie teacher call
- **************************************************
相關文章
- Decorator裝飾設計模式設計模式
- 設計模式--裝飾模式(Decorator Pattern)設計模式
- 設計模式-裝飾模式(Decorator Pattern)設計模式
- PHP設計模式- Decorator 裝飾器模式PHP設計模式
- java設計模式-裝飾器模式(Decorator)Java設計模式
- 設計模式之裝飾器模式(decorator pattern)設計模式
- PHP設計模式之裝飾器模式(Decorator)PHP設計模式
- C++ 設計模式 裝飾模式(Decorator Pattern)C++設計模式
- JAVA設計模式之 裝飾模式【Decorator Pattern】Java設計模式
- C#設計模式系列:裝飾模式(Decorator)C#設計模式
- C#設計模式-裝飾器模式(Decorator Pattern)C#設計模式
- 設計模式的征途—10.裝飾(Decorator)模式設計模式
- PHP設計模式(六)—裝飾器模式(Decorator Pattern)PHP設計模式
- Java設計模式之裝飾者模式(Decorator pattern)Java設計模式
- 設計模式--裝飾器模式Decorator(結構型)設計模式
- Decorator裝飾模式模式
- 裝飾模式 (Decorator Pattern)模式
- 裝飾器模式(Decorator)模式
- 前端常用設計模式(1)--裝飾器(decorator)前端設計模式
- Net設計模式例項之裝飾者模式(Decorator Pattern)設計模式
- 設計模式中的俄羅斯套娃:裝飾者(Decorator)模式設計模式
- 設計模式——裝飾模式設計模式
- 設計模式-裝飾模式設計模式
- 設計模式-裝飾設計模式設計模式
- 常用開源框架中設計模式使用分析- 裝飾器模式(Decorator Pattern)框架設計模式
- 設計模式----裝飾器模式設計模式
- 設計模式-裝飾者模式設計模式
- 設計模式——裝飾者模式設計模式
- 設計模式-裝飾器模式設計模式
- [設計模式] 裝飾器模式設計模式
- 設計模式(八):裝飾模式設計模式
- 【設計模式之裝飾模式】設計模式
- 設計模式之裝飾模式設計模式
- [設計模式]裝飾者模式設計模式
- 09 結構型模式之裝飾者模式(decorator)模式
- 裝飾設計模式設計模式
- python: 設計模式(design pattern)之修飾器模式(decorator)Python設計模式
- 小白設計模式:裝飾者模式設計模式