亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

實例解析設計模式中的外觀模式在iOS App開發中的運用

2020-07-26 03:24:14
字體:
來源:轉載
供稿:網友

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

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

2016330142327941.jpg (500×325)

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

注意:本文所有代碼均在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 來訪問這些服務。

2016330142357578.png (480×71)

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:。這個類首先更新本地數據,如果聯網,它再更新遠端服務器。這就是外觀設計的長處;當一些系統外的類添加了一個新專輯,它不知道─也不需要知道─復雜的內部系統。

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

2016330142423756.png (211×320)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91色视频在线观看| 成人伊人精品色xxxx视频| 精品成人久久av| 国产91在线高潮白浆在线观看| 亚洲精品之草原avav久久| 亚洲男人天堂手机在线| 一本一道久久a久久精品逆3p| 亚洲午夜未满十八勿入免费观看全集| 中文字幕亚洲欧美在线| 国内久久久精品| 日韩av在线影院| 在线午夜精品自拍| 亚洲福利精品在线| 狠狠色狠狠色综合日日五| 久久久国产精彩视频美女艺术照福利| 疯狂欧美牲乱大交777| 久久久中精品2020中文| 色综合伊人色综合网| 日韩免费精品视频| 国产91露脸中文字幕在线| 国产精品入口免费视| 久久av资源网站| 精品网站999www| 国产精品视频自在线| 久久久久久久网站| 亚洲男人第一网站| 色先锋资源久久综合5566| 欧美日韩国产综合新一区| 成人亲热视频网站| 热门国产精品亚洲第一区在线| 中文字幕精品视频| 欧美黑人性视频| 亚洲一区二区福利| 国产精品美女www爽爽爽视频| 国内外成人免费激情在线视频| 日韩av片电影专区| 欧美高清电影在线看| 国产一区二区视频在线观看| 亚洲成人av中文字幕| 日韩在线免费观看视频| 亚洲一区二区精品| 亚洲天堂免费在线| 亚洲激情小视频| 国产精品成人av在线| 国产欧美va欧美va香蕉在线| 羞羞色国产精品| 久久久久www| 精品在线小视频| 久久夜精品香蕉| 国产男人精品视频| 国产69久久精品成人| 久久亚洲国产精品| 成人午夜在线视频一区| 久久国产精品99国产精| 日韩电影在线观看中文字幕| 国产一区二区三区网站| 久久99精品久久久久久琪琪| 综合网日日天干夜夜久久| 日韩视频免费在线| 久久综合免费视频影院| 午夜精品久久久久久久99黑人| 精品久久久久久| 中文字幕欧美日韩在线| 日韩有码片在线观看| 日韩欧美成人网| 日本aⅴ大伊香蕉精品视频| 在线观看视频亚洲| 麻豆国产精品va在线观看不卡| 久久久久久999| 国产视频久久久久久久| 91精品91久久久久久| 国产精品国产自产拍高清av水多| 日韩av在线资源| 91精品久久久久久久久不口人| 欧美亚洲国产视频| 日韩成人中文电影| 国产精品夜间视频香蕉| 美女久久久久久久久久久| 国产在线观看不卡| 亚洲欧美一区二区三区在线| 欧美日韩精品在线观看| 日韩在线免费视频观看| 成人免费看片视频| 国产91精品黑色丝袜高跟鞋| 91精品国产自产在线| 97久久精品人搡人人玩| 亚洲另类xxxx| 久久大大胆人体| 欧洲美女7788成人免费视频| 91欧美日韩一区| 国产福利视频一区二区| 欧美日韩在线另类| 欧美成人一区二区三区电影| 国产精品精品一区二区三区午夜版| 欧美日韩第一视频| 欧美激情在线播放| 久久男人的天堂| 国产午夜精品全部视频播放| 国产精品99一区| 日韩精品极品在线观看播放免费视频| 亚洲系列中文字幕| 在线观看91久久久久久| 亚洲国产成人av在线| 国产91精品视频在线观看| 日韩中文字幕免费看| 日韩欧美亚洲一二三区| 欧美最猛黑人xxxx黑人猛叫黄| 伊人久久精品视频| 97国产一区二区精品久久呦| 青青在线视频一区二区三区| 国产欧美一区二区三区在线| 亚洲91av视频| 欧美激情三级免费| 久久精品福利视频| 日韩精品在线影院| 国产精品国产亚洲伊人久久| 国产精品男女猛烈高潮激情| 国模叶桐国产精品一区| 91中文字幕在线| 国产精品影片在线观看| 欧美大人香蕉在线| 欧美在线一区二区三区四| 亚洲电影免费观看高清| 日韩成人黄色av| 韩国19禁主播vip福利视频| 日本欧美爱爱爱| 精品亚洲国产视频| 日韩黄色在线免费观看| 亚洲美女在线观看| 亚洲午夜女主播在线直播| 久久久久久18| 日韩精品极品视频| 欧美成年人视频网站欧美| 久久久999成人| 日韩经典第一页| 欧美怡红院视频一区二区三区| 91在线高清视频| 国产欧美精品一区二区三区介绍| 91亚洲精品一区二区| 欧美亚洲日本黄色| 在线日韩精品视频| 欧美视频在线观看免费网址| 久久理论片午夜琪琪电影网| 26uuu亚洲国产精品| 中国china体内裑精亚洲片| 欧美亚洲视频在线看网址| 日韩欧美aⅴ综合网站发布| 性欧美办公室18xxxxhd| 久久精品国产99国产精品澳门| 亚洲精品日韩欧美| 日韩av电影在线免费播放| 亚洲精品免费网站| 久久在线精品视频| 国产精品三级美女白浆呻吟| 国产精品99蜜臀久久不卡二区| 欧美日韩人人澡狠狠躁视频| 91在线视频一区| 欧美色另类天堂2015| 国产精品久久久av久久久| 国产91精品久久久久久久| 国产精品第一视频| 亚洲精选在线观看| 久久久女女女女999久久| 成人午夜在线影院|