裝飾模式 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:我們很像但不是一個人好嗎?-介面卡模式和外觀模式
介面卡模式: 將一個類的介面,轉接成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間。 外觀模式: 提供了一個統一的介面,用來訪問子系統中的一群介面。外觀定義了一個高層介面,讓子系統更容易使用。 設計原則:最少知識原則:只和你的密友談話。 解釋:當需要使用一個現有