用OC認識設計模式(二) 結構型模式

韋家冰發表於2017-12-13

用OC程式碼認識設計模式(一)--建立型模式 用OC程式碼認識設計模式(二)--結構型模式 用OC程式碼認識設計模式(三)--行為型模式 用OC程式碼認識六大設計原則 ####結構型模式 #####1、介面卡模式 定義:將一個類的介面轉換成客戶希望的另外一個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。 有兩種型別:類介面卡、物件介面卡 ######(1)類介面卡(Adapter) IOS設計模式淺析之介面卡模式(Adapter) 定義:類介面卡是通過繼承來適配兩個介面,(OC沒有多重繼承,用協議)

Demo例子:

// Target.h 協議
@protocol Target <NSObject>
- (void)request;
@end
複製程式碼
@implementation Adaptee
- (void)specificRequest
{
    NSLog(@"specificRequest");
}
複製程式碼
// 適配物件,繼承Adaptee類,現實Target協議
// Adapter.h
@interface Adapter : Adaptee<Target>
@end

 // Adapter.m
@implementation Adapter
- (void)request
{
    [self specificRequest];
}
@end
複製程式碼

使用程式碼:

     Adapter *target = [[Adapter alloc] init]; 
     [target request];
複製程式碼

######(2)物件介面卡 定義:物件介面卡不繼承被適配者,而是組合了一個對它的引用。

// Target.h 協議
@protocol Target <NSObject>
- (void)request;
@end
複製程式碼
@implementation Adaptee
- (void)specificRequest
{
    NSLog(@"specificRequest");
}
複製程式碼
// 適配物件,持有Adaptee物件,現實Target協議
// Adapter.h
@interface Adapter :<Target>
@property (nonatomic, strong) Adaptee *daptee;
@end

 // Adapter.m
@implementation Adapter
- (void)request
{
    [_adaptee specificRequest];
}
@end
複製程式碼

使用程式碼:

    Adapter *target = [[Adapter alloc] init]; 
    target.abaptee = [[Adaptee alloc] init]; 
    [target request];
複製程式碼

最後兩者區別就是:一個是繼承Adaptee類,一個是持有abaptee物件

#####2、橋接模式 定義:將抽象部分與它的實現部分分離,使它們都可以獨立地變化

一般的設計模式

一般分類.png

當我們增加一個手機品牌HTC,按照品牌分類的話我們需要增加手機品牌類HTC,還需要增加兩個手機軟體類HTC的QQ、HTC的微信;同樣,如果需要增加一個手機軟體,那麼按照手機軟體分類的話,我們也是需要增加三個類。當我們需要增加更多的手機品牌和手機軟體時,我們會發現類會越來越多,以致無法維護。

橋接的設計模式:

橋接模式.jpg
程式碼截圖:

橋接模式.png

#####3、裝飾器模式 裝飾模式能動態的給一個物件新增一些額外的職責。就增加功能來說,裝飾模式會比通過繼承生成子類更為靈活。

OC的Category 就是裝飾器模式的一種應用

#####4、組合模式 定義:將物件組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。 程式碼截圖:

組合模式.png

#####5、外觀模式 定義:外觀模式要求一個子系統的外部與內部的通訊必須通過一個統一的物件進行。外觀模式提供一個高層次的介面,用來訪問子系統中的一群介面。

程式碼截圖: 綠框就是:提供一個高層次的介面,用來訪問子系統中的一群介面

外觀模式.png

#####6、享元模式 定義:運用共享技術有效地支援大量細粒度的物件。

OC程式碼:UITableViewCell 重用機制就是享元模式的典型應用 簡單的程式碼:

享元模式.png

#####7、代理模式 定義:為其他物件提供一種代理以控制對這個物件的訪問(這個和物件介面卡模式差不多) 程式碼截圖:

代理模式.png

相關文章