外不雅形式(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:。這個類起首更新當地數據,假如聯網,它再更新遠端辦事器。這就是外不雅設計的優點;當一些體系外的類添加了一個新專輯,它不曉得─也不須要曉得─龐雜的外部體系。
提醒:當在你的子體系裡設計一個外不雅類的時刻,記住沒有任何器械能夠阻攔客戶拜訪這些「隱蔽」類。要多寫些進攻性的代碼,不要想固然的以為一切客戶都邑用異樣的方法應用你的外不雅類。
運轉你的法式,你會看一個黑底空白內容的屏幕,像上面如許:
【實例解析設計形式中的外不雅形式在iOS App開辟中的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!