最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實(shí)例解析設(shè)計(jì)模式中的外觀模式在iOS App開發(fā)中的運(yùn)用

 更新時間:2016年03月30日 14:25:17   作者:李剛  
這篇文章主要介紹了設(shè)計(jì)模式中的外觀模式在iOS App開發(fā)中的運(yùn)用,實(shí)例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下

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

下面給大家展示一下類的結(jié)構(gòu)圖,想必大家一看就明白了:

2016330142327941.jpg (500×325)

其實(shí)這個模式中,沒有類與類之間的繼承關(guān)系,只是進(jìn)行了簡單的類引用,統(tǒng)一了對外的接口而已??雌饋硎遣皇呛芎唵危繌U話不多說了,下面簡單向大家展示一下代碼吧!

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

SubSystemOne類接口

復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

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


SubSystemOne類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "SubSystemOne.h"

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


SubSystemTwo類接口
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

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


SubSystemTwo類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "SubSystemTwo.h"

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


SubSystemThree類接口
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

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


SubSystemThree類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "SubSystemThree.h"

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


SubSystemFour類接口
復(fù)制代碼 代碼如下:

#import <Foundation/Foundation.h>

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


SubSystemFour類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#import "SubSystemFour.h"

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


Facade類接口
復(fù)制代碼 代碼如下:

#import<Foundation/Foundation.h>

@class SubSystemOne;//此處@class關(guān)鍵字的作用是聲明(不是定義哦)所引用的類
@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類實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#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()方法調(diào)用
復(fù)制代碼 代碼如下:

#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;
}


在開發(fā)軟件時候,考慮使用外觀模式的情況一般分為三種情況。第一種情況,設(shè)計(jì)初始階段,應(yīng)該要有意識的將不同的兩個分層分離,層與層之間建立外觀Facade,這樣可以為復(fù)雜的子系統(tǒng)提供一個簡單的接口,使得耦合大大降低。第二種情況,在開發(fā)階段子系統(tǒng)往往因?yàn)椴粩嗟闹貥?gòu)演化而變得越來越復(fù)雜,增加外觀Facade可以提供一個簡單的接口,減少它們之間的依賴。第三種情況,在維護(hù)一個遺留的大型系統(tǒng)時,可能這個系統(tǒng)已經(jīng)非常難以維護(hù)和擴(kuò)展了,如果有新的需求,那么可以為新系統(tǒng)開發(fā)一個外觀Facade類,來提供設(shè)計(jì)粗糙或高度復(fù)雜的遺留代碼的比較清晰簡單的接口,讓新系統(tǒng)與Facade對象交互,F(xiàn)acade與遺留代碼交互所有復(fù)雜的工作,這樣可以保持較低的耦合度。

實(shí)例進(jìn)階
目前你有 PersistencyManager 來在本地存儲專輯數(shù)據(jù),HTTPClient 處理遠(yuǎn)程通信。項(xiàng)目中其它的類跟這些邏輯都沒關(guān)。

執(zhí)行這個模式,只有 LibraryAPI 來保存 PersistencyManager 和 HTTPClient 的實(shí)例。之后,LibraryAPI 將會公開一個簡單的 API 來訪問這些服務(wù)。

2016330142357578.png (480×71)

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

打開 LibraryAPI.h,在頂部引入面文件:

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

復(fù)制代碼 代碼如下:

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

現(xiàn)在,這些方法都公開給了其它類。

在 LibraryAPI.m 文件引入如下兩個文件:

#import "PersistencyManager.h"
#import "HTTPClient.h"
只有在這個地方你才會需要引入這些類。記?。耗愕?API 將會是你「復(fù)雜」系統(tǒng)的唯一的接入點(diǎn)。

現(xiàn)在添加一些私有屬性在你的類的擴(kuò)展里(在 @implementation 上面)

復(fù)制代碼 代碼如下:

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

isOnline 用來判斷,如果專輯列表數(shù)據(jù)發(fā)生變化是否能夠更新到服務(wù)器,例如添加或者刪除專輯。

你現(xiàn)在需要在 init 方法中初始化這些變量,在 LibraryAPI.m 中添加下面代碼:

復(fù)制代碼 代碼如下:

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

這個 HTTP 客戶端在這里并不真正的工作,它只是在外觀設(shè)計(jì)里面起一個示范用法的作用,所以 isOnline 永遠(yuǎn)是 NO 了。

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

復(fù)制代碼 代碼如下:

- (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:。這個類首先更新本地?cái)?shù)據(jù),如果聯(lián)網(wǎng),它再更新遠(yuǎn)端服務(wù)器。這就是外觀設(shè)計(jì)的長處;當(dāng)一些系統(tǒng)外的類添加了一個新專輯,它不知道─也不需要知道─復(fù)雜的內(nèi)部系統(tǒng)。

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

2016330142423756.png (211×320)

相關(guān)文章

  • iOS開發(fā)教程之登錄與訪客的邏輯實(shí)現(xiàn)

    iOS開發(fā)教程之登錄與訪客的邏輯實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于iOS開發(fā)教程之登錄與訪客的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 如何在自己的電腦上配置APNS推送環(huán)境

    如何在自己的電腦上配置APNS推送環(huán)境

    這篇文章主要介紹了如何在自己的電腦上配置APNS推送環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • iOS拍照后圖片自動旋轉(zhuǎn)90度的完美解決方法

    iOS拍照后圖片自動旋轉(zhuǎn)90度的完美解決方法

    今天開發(fā)一個拍照獲取照片的功能的時候, 發(fā)現(xiàn)上傳之后圖片會自動旋轉(zhuǎn)90.在測試中發(fā)現(xiàn)只要是圖片大于2M, 系統(tǒng)就會自動翻轉(zhuǎn)照片。下面小編通過本文給大家分享下解決辦法
    2016-12-12
  • 推薦一個非常棒的Titanium MVC框架

    推薦一個非常棒的Titanium MVC框架

    ChariTi是一個非常不錯的Titanium MVC框架。此框架的特點(diǎn)是很多東西可直接通過配置文件實(shí)現(xiàn),如APP的主題顏色,每個tab的內(nèi)容,是否使用滑動菜單布局,是否支持tablet布局等,而且其對iOS 和 android也有很好的支持,同時也支持橫屏和豎屏的轉(zhuǎn)換然后使用不同的布局。
    2014-07-07
  • iOS離屏渲染過程示例解析

    iOS離屏渲染過程示例解析

    這篇文章主要為大家介紹了iOS離屏渲染過程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 詳解iOS 裁剪圓形圖像并顯示(類似于微信頭像)

    詳解iOS 裁剪圓形圖像并顯示(類似于微信頭像)

    本篇文章主要介紹了iOS 裁剪圓形圖像并顯示(類似于微信頭像),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 淺析iOS的Xcconfig

    淺析iOS的Xcconfig

    本篇文章介紹IOS中Xcconfig的相關(guān)知識內(nèi)容,有興趣的朋友學(xué)習(xí)下吧。
    2018-01-01
  • iOS微信第三方登錄實(shí)例

    iOS微信第三方登錄實(shí)例

    這篇文章主要為大家詳細(xì)介紹了iOS微信第三方登錄實(shí)現(xiàn)過程,一步一步告訴大家iOS微信實(shí)現(xiàn)第三方登錄的方法,感興趣的小伙伴們可以參考一下
    2016-12-12
  • IOSdrawRect實(shí)現(xiàn)雪花飄落效果

    IOSdrawRect實(shí)現(xiàn)雪花飄落效果

    這篇文章主要為大家詳細(xì)介紹了IOSdrawRect實(shí)現(xiàn)雪花飄落效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • iOS和JS交互教程之WKWebView-協(xié)議攔截詳解

    iOS和JS交互教程之WKWebView-協(xié)議攔截詳解

    這篇文章主要給大家介紹了關(guān)于iOS和JS交互教程之WKWebView-協(xié)議攔截的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09

最新評論

长岭县| 武威市| 灵石县| 磐安县| 英吉沙县| 龙门县| 富裕县| 信阳市| 新乡县| 波密县| 奉贤区| 镇康县| 洪湖市| 陵川县| 郯城县| 长治县| 仙桃市| 葫芦岛市| 深州市| 祥云县| 福鼎市| 临沂市| 富宁县| 金沙县| 临潭县| 桂东县| 临潭县| 静宁县| 昌吉市| 苏尼特右旗| 山阳县| 台东市| 天镇县| 浙江省| 定安县| 龙州县| 阜宁县| 灌南县| 乌兰县| 鄄城县| 南平市|