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