你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 實例解析設計形式中的外不雅形式在iOS App開辟中的應用

實例解析設計形式中的外不雅形式在iOS App開辟中的應用

編輯:IOS開發綜合

外不雅形式(Facade),為子體系中的一組接口供給一個分歧的界面,此形式界說 一個高層接口,這個接口使得這一子體系加倍輕易應用。

上面給年夜家展現一下類的構造圖,想必年夜家一看就明確了:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615491638.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 來拜訪這些辦事。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615491669.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:。這個類起首更新當地數據,假如聯網,它再更新遠端辦事器。這就是外不雅設計的優點;當一些體系外的類添加了一個新專輯,它不曉得─也不須要曉得─龐雜的外部體系。

提醒:當在你的子體系裡設計一個外不雅類的時刻,記住沒有任何器械能夠阻攔客戶拜訪這些「隱蔽」類。要多寫些進攻性的代碼,不要想固然的以為一切客戶都邑用異樣的方法應用你的外不雅類。
運轉你的法式,你會看一個黑底空白內容的屏幕,像上面如許:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615491675.png (211×320)

【實例解析設計形式中的外不雅形式在iOS App開辟中的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved