理解結構設計模式
1、結構型模式描述如何將對象和類組合成更大的結構
2、結構型模式是一種能夠簡化設計工作的模式,因爲它能夠找出更簡單的方法來認識或表示實體之間的關係。在面向對象世界中,實體指的是對象或類。
3、類模式可以通過繼承來描述抽象,從而提供更有用的程序接口,而對象模式則描述瞭如何將對象聯繫起來從而組合成更大的對象。結構型模式是類和對象模式的綜合體
下面是結構型設計模式的一些例子:
適配器模式:將一個接口轉換成客戶希望的另外一個接口。它試圖根據客戶端的需要來匹配不同類的接口。
橋接模式:該模式將對象的接口與其實現進行解耦,使得兩者可以獨立工作
裝飾器模式:該模式允許在運行時或以動態的方式爲對象添加職責,我們可以通過接口給對象添加某些屬性
理解門面設計模式
門面通常是指建築物的表面,尤其時最有吸引力的那一面。它也可以表示一種容易讓人誤解某人的真實感受或情況的行爲或面貌。當人們從建築物的外面經過時,可以欣賞其外部面貌,卻不瞭解建築物結構的複雜性。這就是門面模式的使用方式。門面在隱藏內部系統複雜性的同時,爲客戶端提供一個接口,以便它們可以非常輕鬆訪問系統。
門面設計模式實際上完成了下列事項:
1、它爲子系統中的一組接口提供一個統一的接口,並定義一個高級接口來幫助客戶端通過更加簡單的方式使用子系統。
2、門面所解決問題是,如何使用單個接口對象來表示複雜的子系統。實際上,他並不是封裝子系統,而是對底層子系統進行組合。
3、他促進了實現與多個客戶端的解耦
門面設計模式主要有三個參與者,門面、系統、客戶端
門面:門面的主要責任是,將一組複雜導致系統封裝起來,從而爲外部世界提供一個舒適的外觀。
1、它是一個接口,他知道某給請求可以交個那個子系統進行處理
2、它使用組合將客戶端的請求委派給相應的子系統對象
系統:這代表一組不同的子系統,是整個系統混雜在一起,難以觀察或使用
1、它實現子系統的功能,同時,系統由一個類表示。理想情況下,系統應該由一組負責不同任務的類來表示。
2、它處理門面對象分配的工作,但並不知道門面,而且不吸引它
客戶端:客戶端與門面進行交互,這樣就可以輕鬆地與系統進行同學並完成工作,不必擔心繫統的複雜性。
1、客戶端是實例化門面的類
2、爲了讓子系統完成相應的工作,客戶端需要向門面提出請求
以生活中的例子實現門面模式
假設你要在家中舉辦一場婚禮,並且由你來張羅着一切。這是一個艱鉅的任務,你必須預訂一家酒店或者場地,與餐飲人員交代酒菜、佈置場景,並安排音樂。
下面我們從門面模式的角度來看待這些事情。
客戶端:你需要在婚禮前及時完成所有的準備工作。每一項安排都應該是頂級的,這樣客人才會喜歡這些慶祝活動。
門面:會務經理負責與所有相關人員進行交涉,這些人員負責處理食物、花卉裝飾等
系統:它們代表提供餐飲、酒店管理和花卉裝飾等服務的系統。
接下來要談論的是Facade類。如前所述,Facade類簡化了客戶端的接口。就本例來說,EventManager扮演了門面的角色,並簡化了你的工作,Facade與子系統進行交流,並代表你問婚姻完成所有的預定和準備工作。
下面是EventManager類的代碼:
class EventManager(object):
def __init__(self):
self.hotelier = None
self.florist = None
self.caterer = None
self.musician = None
print("EventManager:讓我和他們談談\n")
def arrange(self):
self.hotelier = Hotelier()
self.hotelier.book_hotel()
self.florist = Florist()
self.florist.set_flower_requirements()
self.caterer = Caterer()
self.caterer.set_cuisine()
self.musician = Musician()
self.musician.set_music_type()
下面我們開始深入瞭解子系統。
我們爲這個場景開發了一下類。
① Hotelier類用於預定酒店。它有一個方法,用於檢查當天是否有免費的酒店(__isAvailable)。
② Florist類負責花卉裝飾。這個類提供了set_flower_requirements()方法,用於指定要使用那些種類的花卉來裝飾婚禮。
③ Caterer類用於跟備辦宴席者打交道,並負責安排餐飲。Caterer提供了一個公開的set_cuisine()方法,用來指定婚宴的菜餚類型。
④Musician類用來安排婚禮的音樂,它使用set_music_type()方法來了解婚禮的音樂要求。
以上四個類的代碼如下:
class Hotelier(object):
def __init__(self):
print("安排婚禮的酒店?")
def __isAvailable(self):
print("活動當天酒店免費?")
return True
def book_hotel(self):
if self.__isAvailable():
print("預定酒店\n\n")
class Florist(object):
def __init__(self):
print("婚禮的花卉裝飾?")
def set_flower_requirements(self):
print("康乃馨、玫瑰會被用來裝飾\n\n")
class Caterer(object):
def __init__(self):
print("婚禮宴席的安排?")
def set_cuisine(self):
print("提供中式及歐式的菜餚\n\n")
class Musician(object):
def __init__(self):
print("婚禮的音樂安排?")
def set_music_type(self):
print("將演奏爵士樂和古典音樂")
但是,你很聰明,所以將這些事情都委託給了會務經理;下面看看You類,在本示例中,創建了一個EventManager類的對象,這樣經理就會通過與相關人員進行交涉來籌備婚禮,而你則可以找個地方喝茶去了
class You(object):
def __init__(self):
print("You:婚禮的安排?")
def ask_event_manager(self):
print("You: 聯繫一下活動經理\n\n")
em = EventManager()
em.arrange()
def __del__(self):
print("所有的準備工作都已經完成")
you = You()
you.ask_event_manager()
最少知識原則
門面模式背後的設計原理就是最少知識原則。
最少知識原則指導我們減少對象之間的交互:
1、在設計系統時,對於創建的每個對象,都應該考察與之交互的類的數量,以及交互的方式;
2、遵循這個原則,就能夠避免創建許多彼此緊密耦合的類的情況
3、如果類之間存在大量依賴關係,那麼系統就會變得難以維護。如果對系統中的任何一部分進行修改,都可能導致系統的其他部分被無意改變,這意味着系統會退化,是應該堅決避免的。