1. 程式人生 > >裝飾模式 VS. 外觀模式

裝飾模式 VS. 外觀模式

 一、裝飾模式

小菜想要和MM約會需要給自己扮靚,而新入住房子之前也需要對每個房間裝修一遍,這些事情都有一個共同的特點,就是一個詞“裝飾”,我們可以把裝飾模式應用在這些事情上面。

裝飾模式:就是動態的給一個物件新增一些額外的職責或者是功能,裝飾模式比生成子類更為靈活。是給已有功能動態的新增更多功能的一種方式。舉一個裝修房子例子來說明一下什麼裝飾模式. 

    //裝飾模式
    //父類,所有房子的抽象類
    abstract class Building
    {
        public abstract void Spruce();
    }
    //要裝飾的具體房子類,具體的物件,可以給這個物件新增一些職責
    class Room : Building
    {
        //房間編號
        private string name;
        public Room(string name)
        {
            this.name = name;
        }
        //對具體房間的裝修
        public override void Spruce()
        {
            Console.WriteLine("房間{0}裝修的裝置有", name);
        }
    }
    //裝飾物品,也屬於房子,所以可以抽象成是房子的子類,同時也作為具體裝飾物品的父類
    abstract class Decorator : Building
    {
        protected Building building;
        public void SetBuliding(Building building)
        {
            this.building = building;
        }
        //裝修
        public override void Spruce()
        {
            if (building != null)
            {
                building.Spruce();
            }
        }

    }

    //傢俱
    class Furniture : Decorator
    {
        public override void Spruce()
        {
            Console.WriteLine("     傢俱");
        }
    }
    //電器
    class Elecobject : Decorator
    {
        public override void Spruce()
        {
            Console.WriteLine("     家用電器");
        }
    }
    //娛樂設施
    class Entertainment : Decorator
    {
        public override void Spruce()
        {
            Console.WriteLine("     娛樂設施");
        }
    }
    //運動設施
    class Sports : Decorator
    {
        public override void Spruce()
        {
            Console.WriteLine("     運動設施");
        }
    }

客戶端:
            Building room1 = new Room("room1");
            Furniture furniture1 = new Furniture();
            Elecobject elec = new Elecobject();
            Entertainment enter = new Entertainment();
            Sports sport = new Sports();

            room1.Spruce();
            furniture1.Spruce();
            elec.Spruce();
            enter.Spruce();
            sport.Spruce();

            Console.Read();

裝飾模式的優點:

(1)就是把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類,有效的把類的核心職責和裝飾功能區分開了。

(2)通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計者可以創造出很多不同行為的組合。

裝修房間與人的裝扮不同,可以沒有先後順序,因為房間內的空間是一定的,裝修的傢俱、電器可以沒有先後順序的放入房間。當有一些傢俱以後,開可以根據喜好再動態的新增自己喜好的傢俱,電器等等。

適合裝飾者應用場合:

1、當我們需要為某個現有的物件動態的增加一個新的功能或指責時,可以考慮使用裝飾模式。

2、當某個物件的指責經常發生變化或者經常需要動態的增加指責,避免為了適應這樣的變化,而增加繼承子類擴充套件的方式,因為這種方式會造成子類膨脹的速度過快,難以控制。

五月天有一首歌這樣唱道:學長要想把妹子要會彈吉他,T1213121……,如今小菜說,學長不僅要回彈吉他還要學會裝飾模式……

   裝飾模式是某樣東西的內容的附加,從而得到新的東西,而外觀模式是對一系列的介面進行封裝。這就引出了另一個設計模式——外觀模式。

二、外觀模式 

外觀模式:為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。

    例如,使用開關的例子。

    //外觀模式
    //外觀類,開關外觀
    class SwithFacade
    {
        Light light;
        Fan fan;
        Telivision telivision;
        AirConditioner airconditioner;

        public SwithFacade()
        {
            light = new Light();
            fan = new Fan();
            telivision = new Telivision();
            airconditioner = new AirConditioner();
        }
        public void Turnon()
        {
            Console.WriteLine("進門開啟");
            light.Turnon();
            telivision.Turnon();
        }
        public void Turnoff()
        {
            Console.WriteLine("出門要記得關閉:");
            light.Turnoff();
            telivision.Turnoff();
            airconditioner.Turnoff();
            fan.Turnoff();
        }
    }
    //子系統類
    //電燈類
    class Light
    {
        public void Turnon()
        {
            Console.WriteLine("電燈開啟");
        }
        public void Turnoff()
        {
            Console.WriteLine("電燈關閉");
        }
    }
    //電風扇類
    class Fan

    //電視類
  
    //空調類
    class AirConditioner
客戶端:
            SwithFacade facade = new SwithFacade();
            facade.Turnon();
            facade.Turnoff();
            Console.Read();

   外觀模式的優點是:

(1)將客戶端與具體的子系統實現分隔開,提高了子系統的獨立性和可移植性。

(2)實現子系統與客戶的鬆耦合性,使得子系統的元件變化不會影響到呼叫它的客戶類,只需調整外觀類即可。

(3)只提供了一個訪問子系統的統一入口,並不影響使用者直接使用子系統類。

三、裝飾模式 VS.外觀模式

    裝飾模式:封裝一個物件,並提供額外的行為,用組合的方式來替代繼承以擴充套件類的功能。 

    外觀模式:封裝許多物件,以簡化它們的介面,此模式定義了一個高層的介面,這個介面使得這一子系統更加容易使用


相關推薦

裝飾模式 VS. 外觀模式

 一、裝飾模式 小菜想要和MM約會需要給自己扮靚,而新入住房子之前也需要對每個房間裝修一遍,這些事情都有一個共同的特點,就是一個詞“裝飾”,我們可以把裝飾模式應用在這些事情上面。 裝飾模式:就是動態的給一個物件新增一些額外的職責或者是功能,裝飾模式比生成子類更為靈活。是給已

Java設計模式外觀模式裝飾模式的設計(精選)

前言 本篇來學習下結構型模式的外觀模式和裝飾器模式。 外觀模式 簡介 外觀模式隱藏系統的複雜性,並向客戶端提供了一個客戶端可以訪問系統的介面。這種型別的設計模式屬於結構型模式,它向現有的系統新增一個介面,來隱藏系統的複雜性。 簡單的來說就是對外提供一個簡單介面,

設計模式學習(C++實現)7——介面卡模式裝飾模式、代理模式外觀模式

介面卡模式、裝飾器模式、代理模式和外觀有些類似,又有些不同,他們的實現形式差不多,都是對已有的方法和類進行封裝,以實現適配、增強、加以控制或隱藏系統複雜性的目的 1 介面卡模式 例如多功能讀卡器,可插入多種不同的卡,完成讀取資料的功能。 class C

java設計模式外觀模式

數據 開發 移位運算 傳遞 保存 load space 法則 rep 【學習難度:★☆☆☆☆,使用頻率:★★★★★】 外觀模式是一種使用頻率非常高的結構型設計模式,它通過引入一個外觀角色來簡化客戶端與子系統之間的交互,為復雜的子系統調用提供一個統一的入口,降低子系統與

設計模式外觀模式

設計模式 外觀模式 facade 門面模式 1、外觀模式的簡單介紹(也叫門面模式): a、外觀模式和迪米特法則(最少知識的原則,一個軟件實體應當盡可能少的與其他實體發生相互作用)的聯系緊密。 b、外觀模式的核心: - 為子系統提供統一的入口。封裝子系統的復雜性,便於

Head First設計模式外觀模式

實現 add ads important pac mar private 入口 summary 一、定義 外觀模式提供了一個統一的接口,用來訪問子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。 外觀模式不只是簡化了接口,也將客戶從組件的子系統中解耦。

【JAVA設計模式外觀模式(Facade Pattern)

簡單 產生 creat ide oid dsm ref 功能 .net 一 定義 為子系統中的一組接口提供一個一致的界面。Facade模式定義了一個高層的接口,這個接口使得這一子系統更加easy使用。 二 案例 一個子系統中擁有3個模塊。每一個模塊

門面模式外觀模式

package archive 相互調用 int 選擇 oid pub href sta 參考:http://www.cnblogs.com/java-my-life/archive/2012/05/02/2478101.html /DesignPatterns/sr

設計模式外觀模式(6)

__name__ 基類 body 訪問 get self 簡化 self. getattr 外觀模式(Facade Pattern)隱藏系統的復雜性,並向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的復雜

2.泡妞與設計模式(三) 外觀模式

col 多個 style div AC 自己 box 有一個 int FACADE 門面(外觀)模式 門面模式:外部與一個子系統的通信必須通過一個統一的門面對象進行。門面模式提供一個高層次的接口,使得子系統更易於使用。每一個子系統只有一個門面類,而且此門面類只有一個實例,也

C#設計模式外觀模式(Facade Pattern)

避免 linq 訪問 客戶端 這一 存在 www 針對 public 一,什麽是外觀模式? 外觀模式:為子系統中的一組接口提供一個一致的界面,定義一個高層接口,這個接口使得這一子系統更加容易使用。 二,我們看看代碼的實現 using System; using Syste

設計模式外觀模式(九)

處理 相互 ole 開閉原則 繼承 ali mes 如何解決 esp 設計模式之外觀模式 一、引言   當一個復雜的系統由多個復雜的子系統構成,然後客戶端調用會調用多個子系統。這時,客戶端會和多個子系統耦合在一起,當子系統需要擴展或者改變時,客戶端也要隨之改變,我們可以使用

設計模式的藝術 結構性模式外觀模式

前言 去飯館吃飯,自己只需要點個菜,然後自然後廚做好了之後會有服務員給你端上來,真正來講,自己只需要告訴服務員自己要吃的菜就行,不需要與原材料和廚子之間發生任何的互動,在軟體設計思想中也有這樣的場景,為了完成一個複雜的功能,一個類可能需要與多個其他業務類發生互動,而這些互動類經常會作為一個整體出

設計模式——介面卡模式外觀模式

介面卡模式和外觀模式 本文將分別介紹介面卡模式和外觀模式。 1、介面卡模式 1.1、定義 介面卡模式 將一個類的介面,轉換成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間。 介面卡模式的定義非常易懂,就是將一個介面轉換成另一個介面,這樣一來就實現了介面的

設計模式——08 外觀模式

08 Facade Pattern(外觀模式)          前言:讓介面變得簡單。 例子說明:          REQ1

設計模式外觀模式Facade 結構型

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

設計模式外觀模式(Facade)

設計模式之外觀模式(Facade) 場景 病人去醫院看病,首先病人必須先掛號,然後門診。如果醫生要求化驗,病人必須首先劃價,然後繳費,才可以到化驗部門做化驗。化驗後再回到門診室。 解決這種不便的方法便是引進外觀模式,醫院可以設定一個接待員的位置,由接待員負責代為掛號、劃價

《設計模式》之一文帶你理解建造者模式、模板方法、介面卡模式外觀模式

我的github,到時上傳例子程式碼 https://github.com/tihomcode 《設計模式》之一文帶你理解單例、JDK動態代理、CGLIB動態代理、靜態代理 建造者模式 什麼是建造者模式 建造者模式:是將一個複雜的物件的構建與它的表示分離,使得

java高階設計模式外觀模式

定義 為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 結構和說明 基本實現例項 1、客戶端 Facade 裡面都是介面和簡單實現方法,沒必要貼了。

走進設計模式的世界7:我們很像但不是一個人好嗎?-介面卡模式外觀模式

介面卡模式: 將一個類的介面,轉接成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間。 外觀模式: 提供了一個統一的介面,用來訪問子系統中的一群介面。外觀定義了一個高層介面,讓子系統更容易使用。 設計原則:最少知識原則:只和你的密友談話。 解釋:當需要使用一個現有