執行個體解析設計模式中的面板模式在iOS App開發中的運用_IOS

來源:互聯網
上載者:User

面板模式(Facade),為子系統中的一組介面提供一個一致的介面,此模式定義 一個高層介面,這個介面使得這一子系統更加容易使用。

下面給大家展示一下類的結構圖,想必大家一看就明白了:

其實這個模式中,沒有類與類之間的繼承關係,只是進行了簡單的類引用,統一了對外的介面而已。看起來是不是很簡單?廢話不多說了,下面簡單向大家展示一下代碼吧!

注意:本文所有代碼均在ARC環境下編譯通過。

SubSystemOne類介面

複製代碼 代碼如下:

#import <Foundation/Foundation.h>

@interface SubSystemOne:NSObject
-(void)MethodOne;
@end


SubSystemOne類實現
複製代碼 代碼如下:

#import "SubSystemOne.h"

@implementation SubSystemOne
-(void)MethodOne{
    NSLog(@"子系統方法一");
}
@end


SubSystemTwo類介面
複製代碼 代碼如下:

#import <Foundation/Foundation.h>

@interface SubSystemTwo:NSObject
-(void)MethodTwo;
@end


SubSystemTwo類實現
複製代碼 代碼如下:

#import "SubSystemTwo.h"

@implementation SubSystemTwo
-(void)MethodTwo{
    NSLog(@"子系統方法二");
}
@end


SubSystemThree類介面
複製代碼 代碼如下:

#import <Foundation/Foundation.h>

@interface SubSystemThree:NSObject
-(void)MethodThree;
@end


SubSystemThree類實現
複製代碼 代碼如下:

#import "SubSystemThree.h"

@implementation SubSystemThree
-(void)MethodThree{
    NSLog(@"子系統方法三");
}
@end


SubSystemFour類介面
複製代碼 代碼如下:

#import <Foundation/Foundation.h>

@interface SubSystemFour:NSObject
-(void)MethodFour;
@end


SubSystemFour類實現
複製代碼 代碼如下:

#import "SubSystemFour.h"

@implementation SubSystemFour
-(void)MethodFour{
    NSLog(@"子系統方法四");
}
@end


Facade類介面
複製代碼 代碼如下:

#import<Foundation/Foundation.h>

@class SubSystemOne;//此處@class關鍵字的作用是聲明(不是定義哦)所引用的類
@class SubSystemTwo;
@class SubSystemThree;
@class SubSystemFour;
@interface Facade :NSObject{
@private SubSystemOne *one;
@private SubSystemTwo *two;
@private SubSystemThree *three;
@private SubSystemFour *four;
}
-(Facade*)MyInit;
-(void)MethodA;
-(void)MethodB;
@end


Facade類實現
複製代碼 代碼如下:

#import "Facade.h"
#import "SubSystemOne.h"
#import "SubSystemTwo.h"
#import "SubSystemThree.h"
#import "SubSystemFour.h"

@implementation Facade
-(Facade*)MyInit{
    one= [[SubSystemOne alloc]init];
    two= [[SubSystemTwo alloc]init];
    three= [[SubSystemThree alloc]init];
    four= [[SubSystemFour alloc]init];
    return self;
}
-(void)MethodA{
    NSLog(@"\n方法組A() ---- ");
    [one MethodOne];
    [two MethodTwo];
    [three MethodThree];
    [four MethodFour];
}
-(void)MethodB{
    NSLog(@"\n方法組B() ---- ");
    [two MethodTwo];
    [three MethodThree];
}
@end


Main()方法調用
複製代碼 代碼如下:

#import <Foundation/Foundation.h>
#import "Facade.h"

int main (int argc,const char * argv[])
{
    @autoreleasepool{
        Facade *facade = [[Facade alloc]MyInit];
        [facade MethodA];
        [facade MethodB];
    }
    return 0;
}


在開發軟體時候,考慮使用面板模式的情況一般分為三種情況。第一種情況,設計初始階段,應該要有意識的將不同的兩個分層分離,層與層之間建立外觀Facade,這樣可以為複雜的子系統提供一個簡單的介面,使得耦合大大降低。第二種情況,在開發階段子系統往往因為不斷的重構演化而變得越來越複雜,增加外觀Facade可以提供一個簡單的介面,減少它們之間的依賴。第三種情況,在維護一個遺留的大型系統時,可能這個系統已經非常難以維護和擴充了,如果有新的需求,那麼可以為新系統開發一個外觀Facade類,來提供設計粗糙或高度複雜的遺留代碼的比較清晰簡單的介面,讓新系統與Facade對象互動,Facade與遺留代碼互動所有複雜的工作,這樣可以保持較低的耦合度。

執行個體進階
目前你有 PersistencyManager 來在本機存放區專輯資料,HTTPClient 處理遠程通訊。項目中其它的類跟這些邏輯都沒關。

執行這個模式,只有 LibraryAPI 來儲存 PersistencyManager 和 HTTPClient 的執行個體。之後,LibraryAPI 將會公開一個簡單的 API 來訪問這些服務。

LibraryAPI 將會公開給其它代碼,但是它隱藏了 APP 中 HTTPClient 和 PersistencyManager 的複雜部分。

開啟 LibraryAPI.h,在頂部引入面檔案:

#import "Album.h"
接下來,在 LibraryAPI.h下面添加如下方法:

複製代碼 代碼如下:

- (NSArray*)getAlbums;
- (void)addAlbum:(Album*)album atIndex:(int)index;
- (void)deleteAlbumAtIndex:(int)index;

現在,這些方法都公開給了其它類。

在 LibraryAPI.m 檔案引入如下兩個檔案:

#import "PersistencyManager.h"
#import "HTTPClient.h"
只有在這個地方你才會需要引入這些類。記住:你的 API 將會是你「複雜」系統的唯一的存取點。

現在添加一些私人屬性在你的類的擴充裡(在 @implementation 上面)

複製代碼 代碼如下:

@interface LibraryAPI () {
    PersistencyManager *persistencyManager;
    HTTPClient *httpClient;
    BOOL isOnline;
}
@end

isOnline 用來判斷,如果專輯列表資料發生變化是否能夠更新到伺服器,例如添加或者刪除專輯。

你現在需要在 init 方法中初始化這些變數,在 LibraryAPI.m 中添加下面代碼:

複製代碼 代碼如下:

- (id)init
{
    self = [super init];
    if (self) {
        persistencyManager = [[PersistencyManager alloc] init];
        httpClient = [[HTTPClient alloc] init];
        isOnline = NO;
    }
    return self;
}

這個 HTTP 用戶端在這裡並不真正的工作,它只是在外觀設計裡面起一個示範用法的作用,所以 isOnline 永遠是 NO 了。

接下來,在 LibraryAPI.m 裡面添加下面三個方法:

複製代碼 代碼如下:

- (NSArray*)getAlbums
{
    return [persistencyManager getAlbums];
}

- (void)addAlbum:(Album*)album atIndex:(int)index
{
    [persistencyManager addAlbum:album atIndex:index];
    if (isOnline)
    {
        [httpClient postRequest:@"/api/addAlbum" body:[album description]];
    }
}

- (void)deleteAlbumAtIndex:(int)index
{
    [persistencyManager deleteAlbumAtIndex:index];
    if (isOnline)
    {
        [httpClient postRequest:@"/api/deleteAlbum" body:[@(index) description]];
    }
}


看一下 addAlbum:atIndex:。這個類首先更新本機資料,如果連網,它再更新遠端伺服器。這就是外觀設計的長處;當一些系統外的類添加了一個新專輯,它不知道─也不需要知道─複雜的內部系統。

提示:當在你的子系統裡設計一個外觀類的時候,記住沒有任何東西可能阻止客戶訪問這些「隱藏」類。要多寫些防禦性的代碼,不要想當然的認為所有客戶都會用同樣的方式使用你的外觀類。
運行你的程式,你會看一個黑底空白內容的螢幕,像下面這樣:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.