外观设计模式:
这个外观设计模式提供了一个单独的接口给复杂的子系统。而不是暴露用户的一组类和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:. 这个类第一次更新本地数据,并且如果没有网络链接他更新这个远程服务器。这个是外观设计模式的本质;当系统的其他类添加新专辑时候,不需要知道子系统实现的复杂性。
注意:当用外观设计模式来设计你的子系统时候记住什么也不能阻止客户端直接访问这些隐藏的类。不要吝啬防守的代码不要认为所有的客户一定会使用外观设计模式来使用他们。
编译运行你的应用。你将要看到一个黑色的屏幕。
我们将要需要一些东西展示专辑的数据在屏幕上,这是下一个设计模式的很好的用处。装饰设计模式。
来自英文教程翻译谢绝转载!!!未经允许不得转载维权必究!!!