外觀設計模式:
這個外觀設計模式提供了一個單獨的介面給複雜的子系統。而不是暴露使用者的一組類和API,你僅僅暴露一個簡單的同一的API。
下面的圖片解釋這個概念:
API的使用者根本不知道後面系統的複雜性。這種模式是理想的在處理大量的類,特別是當他們複雜的使用或者很難理解的時候。
這個外觀設計模式使用系統的介面和你隱藏的實現來分離程式碼。他也減少了依賴外部程式碼的子系統運作。這也是有用的如果在外觀設計模式的類可能會改變,外部類可以保留相同的API同時改變幕後的事情。
例如有一天你可能想替換你的伺服器端,你不需要改變程式碼因為你API沒有改變。
怎麼使用外觀設計模式
當前你有PersistencyManager 來儲存專輯資料在本地並且HTTPClient 可以處理遠端通訊。A專案中其他的類不需要注意這個邏輯。
為了實現這個設計模式,僅僅libraryAPI應該擁有PersistencyManager 和HTTPClient的例項。然後libraryAPI將要暴露簡單的API來訪問這些服務。
通常一個單例在應用的生命週期只存在一個例項。你不能在單例裡面保持太多的強引用指標給其他物件,因為知道應用關閉才能釋放。如下圖:
libraryAPI將要暴露給其他程式碼,但是隱藏HTTPClient 和PersistencyManager 來自應用程式的其餘部分複雜性。
開啟LibraryAPI.h 新增匯入標頭檔案:
下一步,新增下面方法定義:
- (NSArray*)getAlbums;
- (void)addAlbum:(Album*)album atIndex:(int)index;
- (void)deleteAlbumAtIndex:(int)index;
現在這些都是你會暴露於其他類的方法
在libraryAPI實現檔案裡匯入下面兩個標頭檔案:
#import "PersistencyManager.h"#import "HTTPClient.h"
這將是你匯入這些類的唯一地方。記住:你的API將是進入你複雜系統的唯一入口點。
現在新增一些私有例項變數在延展在實現檔案裡面@implementation後面。
@interface LibraryAPI () {
PersistencyManager *persistencyManager;
HTTPClient *httpClient;
BOOL isOnline;
}
@end
isOnline 決定是否應該響應更新伺服器的任何更改到專輯列表如新增或刪除專輯。
你 現在需要初始化例項變數在init方法裡面,新增以下程式碼:
- (id)init
{
self = [super init];
if (self) {
persistencyManager = [[PersistencyManager alloc] init];
httpClient = [[HTTPClient alloc] init];
isOnline = NO;
}
return self;
}
這個HTTP 客戶端實際上並不使用一個真正的伺服器,只是來演示使用外觀設計模式。因此isOnline將要一直是no。
然後新增下面三個方法在實現檔案裡:
- (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:. 這個類第一次更新本地資料,並且如果沒有網路連結他更新這個遠端伺服器。這個是外觀設計模式的本質;當系統的其他類新增新專輯時候,不需要知道子系統實現的複雜性。
注意:當用外觀設計模式來設計你的子系統時候記住什麼也不能阻止客戶端直接訪問這些隱藏的類。不要吝嗇防守的程式碼不要認為所有的客戶一定會使用外觀設計模式來使用他們。
編譯執行你的應用。你將要看到一個黑色的螢幕。
我們將要需要一些東西展示專輯的資料在螢幕上,這是下一個設計模式的很好的用處。裝飾設計模式。
來自英文教程翻譯謝絕轉載!!!未經允許不得轉載維權必究!!!