給原有的物件新增新的功能,但不繼承原有的類。
cocoa 中 category 就屬於這種設計模式。
舉例:實現乙個執行緒安全的陣列
某個物件,它的構成/建立十分複雜,可以考慮這種模式。
cocoa 中 nscoping 就屬於這種模式。
舉例: 假設有乙個類 model,它裡面有 100 個屬性 property1 ~ property100。有個物件 model1,這些屬性都已經複製。現在如果需要乙個 model2 和 model3 ,它們都與 model1 只有乙個屬性的值是不同的,那麼有一種做法就是 把生成 model1 的 101 行**複製貼上兩次再修改一下。 還有一種做法,在 model 類中加乙個方法:- (model *)clone;
,然後實現clone
:
- (model *)clone
複製**
這樣我們建立其它 model 的時候就可以這樣做:
model *model2 = [model1 clone];
model2.propertyn = ***;
複製**
nscopying 就是這樣的。nscopying 協議使用的時候要注意以下問題,假設 person 類是這樣的:
copywithzone:的實現:
這樣就會出現乙個問題,如下所示:
person 的 sons 和 person2 的 sons 完全是同乙個物件,假設 sons 可以修改的話,那麼修改 person.sons 和 person2.sons 會相互影響。這完全不是我們想要的結果了。我們可以這樣做:
修改之後,看下面這段**的輸出:
person.sons 與 person2.sons 是兩個不同的陣列了。但是裡面的元素卻是相同的。這裡就牽涉到幾個比較繞的概念了:
感興趣的話可以自己搜一下。現在我們這種情況屬於第二種。
先舉個例子:假設我們要從西安去北京,可以選擇自駕/坐飛機/坐火車等方式,都可以去,可以理解為通過不同的手段達到同乙個目的,但是細節不同,但是我們不關心它的細節,只關心它的目的。
外觀模式使用場景:
有乙個複雜的子系統,它為了得到某種結果,裡面有很多複雜的邏輯,客戶端只想要這個結果,並不關心裡面複雜的邏輯。可以寫乙個中間類,操作這個子系統,客戶端只用從中間類來獲取結果即可。
外觀模式的好處:
解耦合簡化操作
外觀模式與介面卡模式的區別:
外觀模式 -- 意圖提供簡單的介面
介面卡模式 -- 轉換介面
舉例:假設我們有乙個 shape 類,和他的一些子類們:
@inte***ce shape : nsobject
- (void)draw;
@end
****************************************
@inte***ce rectangle : shape
@property (assign, nonatomic) cgfloat width;
@property (assign, nonatomic) cgfloat height;
@end
@implementation rectangle
- (void)draw
@end
****************************************
@inte***ce circle : shape
@property (assign, nonatomic) cgfloat radius;
@end
@implementation circle
- (void)draw
@end
複製**
假設我們在 viewcontroller 中寫了如下**:
- (void)viewdidload
複製**
如果 shape 有多個子類,比如平行四邊形、梯形、八邊形等。那麼它會是乙個特別複雜的系統,並且我們還需要知道這個系統的細節,把資料具體地傳遞到每個物件對應的屬性上才可以。
但其實上我們並不關心在這個系統中它們是怎麼實現的,我們就只想讓它畫個圖形就 ok 了。這是可以這麼做,建立乙個中間類 shapemaker:
@inte***ce shapemaker : shape
- (void)drawrectanglewithparams:(nsdictionary *)dic;
- (void)drawcirclewithparams:(nsdictionary *)dic;
- (void)drawrectangleandcirclewithparams:(nsdictionary *)dic;
...@end
複製**
在 shapemaker 中去實現這些複雜的操作,shapemaker 提供一些簡單的介面供 viewcontroller 使用,viewcontroller 只用使用介面,傳遞資料即可,viewcontroller 並不關心具體實現,也不知道具體每個資料用在哪個地方,它只是讓 shapemaker 畫個形狀就可以了。 外觀設計模式
外觀模式 facade pattern 門面模式,隱藏系統的複雜性,並向客戶端提供了乙個客戶端可以訪問系統的介面。這種型別的設計模式屬於結構型模式,它向現有的系統新增乙個介面,來隱藏系統的複雜性。這種模式涉及到乙個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法的委託呼叫。使用場景 我們需...
設計模式 外觀設計模式
外觀設計模式 facade 又稱為門面設計模式。很好理解,先來舉個例子 一位病人去醫院看病,他要去 然後檢查,取藥,醫院是乙個大系統,而病人需要和每乙個子部門去打交道。比較麻煩。而如果使用門面設計模式,就是在醫院設定乙個接待員,由接待員來幫助病人分別去和各個部門打交道。如下 門面設計模式就是這麼簡單...
js設計模式 外觀設計模式
外部與乙個子系統的通訊必須通過乙個統一的門面 facade 物件進行,這就是門面模式。外觀模式為子系統提供了統一的介面,遮蔽了子類的不同 現代大型軟體發展到一定程度會非常複雜,於是就需要對軟體進行模組化開發,將系統分成各個模組,有利於維護和拓展,但即使這樣在我們呼叫的時候依然要和許多類打交道,依然很...