裝飾 原型 外觀設計模式簡單理解

2021-09-11 10:07:58 字數 2577 閱讀 8635

給原有的物件新增新的功能,但不繼承原有的類。

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 物件進行,這就是門面模式。外觀模式為子系統提供了統一的介面,遮蔽了子類的不同 現代大型軟體發展到一定程度會非常複雜,於是就需要對軟體進行模組化開發,將系統分成各個模組,有利於維護和拓展,但即使這樣在我們呼叫的時候依然要和許多類打交道,依然很...