1. 程式人生 > >設計模式的應用場景(9)--裝飾模式

設計模式的應用場景(9)--裝飾模式

裝飾模式

定義:裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承方案的一個替代方案,提供比繼承更多的靈活性。

優點:能夠提供比使用繼承關係更加靈活的拓展物件的功能,它可以動態增加物件的功能並且可以隨意組合這些功能。

缺點:使用裝飾模式進行設計往往會產生很多看上去相似的小物件。

使用時機:當系統需要擴充套件一個類的功能,或者客戶端需要動態的給一個物件新增功能,並且使用繼承會很複雜時候。

其實對於裝飾者模式大家並不陌生,相反接觸的還很平凡,因為Java中的IO機制就用到了裝飾者模式。比如大家最常用的語句:

BufferedReader br = new BufferedReader(new
InputStreamReader(new FileInputStream(filepath))); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

就是最常見的裝飾者模式了,通過BufferedReader對已有物件FileReader的功能進行加強和優化。其實它不僅可以加強FileReader,所有的字元輸入流都可以通過這種方式進行包裝。它是如何實現的呢?注意重點來了:其實很簡單,它只不過將所有的字元輸入流抽象出了一個基類或介面 即Reader,然後通過構造方法的形式將Reader傳遞給BufferedReader,此時BufferedReader就可以對所有的字元輸入流進行攔截和優化了。

  試想一下,如果採用繼承機制,每個XXXReader就要衍生出一個BufferedXXXReader,再加上字元輸出流和位元組輸入輸出流,那麼Java的IO體系結構該是多麼的臃腫不堪啊!而裝飾者模式的出現解決了這個問題,並且,裝飾者的出現也再一次的證明了面向物件的設計原則:多用組合,少用繼承!對擴充套件開放,對修改關閉!

下面再給出一個例子,
小鞏需要為公司設計手機相關的業務,

public interface Phone {
    void call(String name);
}
public class PhoneImpl implements Phone {
    public
void call(String name) { System.out.println(name + " 正在通話中"); } }

彩鈴手機

public class ColorPhoneDecorator extends PhoneDecorator {
    public ColorPhoneDecorator(Phone phone) {
        super(phone);
    }

    public void call(String name) {
        System.out.println("播放彩鈴");
        super.call(name);
    }
}

廣告手機

public class AdPhoneDecorator extends PhoneDecorator {
    public AdPhoneDecorator(Phone phone) {
        super(phone);
    }

    public void call(String name) {
        super.call(name);
        System.out.println("播放廣告");
    }
}

假如客戶需要支援彩鈴和廣告的手機

public class Client {
    public static void main(String[] argv) {
        Phone phone = new PhoneImpl();
        //如果需要彩鈴的手機
        PhoneDecorator phoneDecorator = new ColorPhoneDecorator(phone);
    //  phoneDecorator.call("張三");
         //如果需要廣告的手機
        //phoneDecorator = new AdPhoneDecorator(phone);
        //phoneDecorator.call("張三");
        //如果需要既播放彩鈴又播放廣告的手機
        phoneDecorator = new AdPhoneDecorator(phoneDecorator);
        phoneDecorator.call("張三");
    }
}

相關推薦

設計模式應用場景(9)--裝飾模式

裝飾模式 定義:裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承方案的一個替代方案,提供比繼承更多的靈活性。 優點:能夠提供比使用繼承關係更加靈活的拓展物件的功能,它可以動態增加物件的功能並且可以隨意組合這些功能。 缺點:使用裝飾模式進行設計往往會

二十三種設計模式[9] - 裝飾模式(Decorator Pattern)

前言        裝飾模式,屬於物件結構型模式。在《設計模式 - 可複用的面向物件軟體》一書中將之描述為“ 動態地給一個物件新增一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活”。    &n

設計模式應用場景(4)--原型模式

原型模式 定義:通過一個原型物件來表明要建立的型別,然後複製這個原型物件的方法來建立更多同類型的物件。 優點:可以動態地新增產品類而且對整體結構沒有影響。 缺點:由於原型模式需要給每一個類都配備一個克隆的方法,這就需要在設計類時通盤考慮。因為在已有類的基

23種設計模式應用場景

設計模式主要分三個型別:建立型、結構型和行為型。 建立型:      一、Singleton,單例模式:保證一個類只有一個例項,並提供一個訪問它的全域性訪問點 ;      應用場景:一個無狀態的類使用單例模式節省記憶體資源。     二、Abstract Factory,

各種設計模式應用場景

定義物件間的一種一對多的依賴關係.當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新.  使用場合;  1.當一個抽象模型有兩個方面,其中一個方面的操作依賴於另一個方面的狀態變化,那麼就可以選用觀察者模式,將這兩者封裝成觀察者和目標物件,當目標物件變化的時候,依賴於它的觀察者物件也會發生相應

設計模式 應用場景

追MM與設計模式 建立型模式  1、FACTORY—追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖 然口味有所不同,但不管你帶MM去麥當勞或肯德基,只管向服務員說“來四個雞翅”就行 了。麥當勞和肯德基就是生產雞翅的Factory  工廠模式:客戶類和工廠類分開。消費者任何時候需要某種產

java設計模式--觀察者模式應用場景

觀察者分為兩種模式:推和拉 推模型是假定知道觀察者需要什麼資料,傳這個資料過去;拉模型是不知道觀察者需要什麼資料,乾脆把自身傳給他,按需取值 應用場景如下: 訂閱火車票之後,需要記錄日誌,也需要傳送簡訊 如果常規寫法,在訂閱火車票內部實現,若以後還需要增加新功能則需要修改

設計模式應用場景(16)--策略模式

策略模式 定義:針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,使得它們可以互相替換。 優點:替換繼承關係,避免使用多重條件轉移語句。 缺點:客戶端必須知道所有策略類,並自行決定使用哪一種策略類。如果演算法較多,則會造成很多的策略類。 使用

c++ 設計模式6 (Decorator 裝飾模式

ces 軟件組件 類繼承 通過 write height cte 中間 類型 4. “單一職責”類模式 在軟件組件的設計中,如果責任劃分的不清晰,使用繼承得到的結果往往是隨著需求的變化,子類急劇膨脹,同時充斥著重復代碼,這時候的關鍵是劃清責任。 典型模式代表: Decora

設計模式之結構型--裝飾模式

ret his 組合 子類 產生 margin per 調用 輸出 裝飾模式: 職責: 動態得為一個對象增加新的功能 裝飾模式是一種用於代替繼承的技術,無須通過繼承增加子類就 能擴展對象的新功能。使用對象的關聯關系代替繼承關系,更加靈活。 同時避免類型體系的快速膨脹

設計模式(八)裝飾模式

裝飾模式(Decotator):動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活 這是在網上找的關於裝飾模式的類圖, http://img0.imgtn.bdimg.com/it/u=3834882730,1020120806&fm=214&

設計模式(五)裝飾模式

裝飾者模式:若要擴充套件功能,裝飾者提供了比整合更有彈性的替代方案,動態地將責任附加到物件上。 先簡單描述下裝飾者模式發揮作用的地方,當我們設計好了一個類,我們需要給這個類新增一些輔助的功能,並且不希望改變這個類的程式碼,這時候就是裝飾者模式大展雄威的時候了。這裡還體現了一

設計模式(四)裝飾模式

老樣子,先來看一個需求: 現在要求寫一個可以給人搭配不同的服飾的系統,比如類似QQ、網路遊戲或論壇都有的Avatar系統。怎麼開發? 第一個版本可能是這樣的—— 第一版 結構圖:   Person類: class Person{ private st

設計模式之詳解——裝飾模式

裝飾模式 就是給一個物件增加一些新的功能,而且是動態的,要求裝飾物件和被裝飾物件實現同一個介面,裝飾物件持有被裝飾物件的例項。 用處: 需要擴充套件一個類的功能。 動態的為一個物件增加功能,而且還能動態撤銷。(繼承不能做到這一點,繼承的功能是靜態的,不能

建造者模式應用場景

建造者模式:        建造者模式,又稱構建者模式,將一部負責物件的構建分為許多小物件的構建,最後在整合構建的模式。      構建者模式一般用在構建流程或者組成部件固定的場合,將這些部件分開構建成為元件物件,再將這些元件物件整

Spring 5 設計模式 - 使用代理和裝飾模式的Spring AOP

Spring 5 設計模式 - 使用代理和裝飾模式的Spring AOP Spring中的代理模式 什麼是AOP AOP要解決的問題 程式碼糾纏 程式碼分散 解決 AOP的核心術語

01.JavaGOF23-建立型模式-單例模式-應用場景_餓漢式_懶漢式

Windows的Task Manager(工作管理員)就是很典型的單例模式 windows的Recycle Bin(回收站)也是典型的單例應用。在整個系統執行過程中,回收站一直維護著僅有的一個例項。 專案中,讀取配置檔案的類,一般也只有一個物件。沒有必要每次使用配置檔案資料,每次new一個物件去讀取。 網站

Android-Activity啟動模式-應用場景

在上一篇部落格中,Android-Activity啟動模式(launchMode),就介紹了Activity四種啟動模式的特點與使用等,但是到底什麼樣子的場景,去使用什麼樣子的啟動模式呢     Activity啟動模式分為四種:      如果不配置:launchMode,預設

android Activity 啟動模式 應用場景

棧的原理:先進後出,後進先出。所有操作都發生在棧頂。 首先介紹一下任務棧: (1)程式開啟時就建立了一個任務棧, 用於儲存當前程式的activity,所有的activity屬於一個任務棧。  (2)一個任務棧包含了一個activity的集合, 去有序的選擇哪一個activ

設計模式》學習筆記——裝飾模式

裝飾模式(Decorator Pattern)指的是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能.它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。 DecoratorPat