外观设计模式:

这个外观设计模式提供了一个单独的接口给复杂的子系统。而不是暴露用户的一组类和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:. 这个类第一次更新本地数据,并且如果没有网络链接他更新这个远程服务器。这个是外观设计模式的本质;当系统的其他类添加新专辑时候,不需要知道子系统实现的复杂性。

注意:当用外观设计模式来设计你的子系统时候记住什么也不能阻止客户端直接访问这些隐藏的类。不要吝啬防守的代码不要认为所有的客户一定会使用外观设计模式来使用他们。

编译运行你的应用。你将要看到一个黑色的屏幕。

我们将要需要一些东西展示专辑的数据在屏幕上,这是下一个设计模式的很好的用处。装饰设计模式。

来自英文教程翻译谢绝转载!!!未经允许不得转载维权必究!!!

IOS设计模式第三篇之外观设计模式的更多相关文章

  1. IOS设计模式第七篇之观察者设计模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 观察者设计模式 在观察者设计模式里面,一个对象通知其他的对象一些状态的改变.涉及这些对象不需要知道另一个对象---因此鼓励解耦设计模式.这个设计模式 ...

  2. IOS设计模式第六篇之适配器设计模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 那么怎么使用适配器设计模式呢? 这个之前提到的水平滚动的视图像这样: 为了开始实现他,我们创建一个新的继承与UIView的HorizontalScr ...

  3. IOS设计模式第四篇之装饰设计模式的类别设计模式

    装饰设计模式 装饰设计模式动态的添加行为和责任向一个对象而不修改他的任何代码.他是你子类化修改类的行为用通过另一个对象的包装的代替方法. 在Objective-c里面有很多这种设计模式的实现,像cat ...

  4. IOS设计模式第五篇之装饰设计模式的代理设计模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 代理: 另一个装饰设计模式,代理,是一个代表或者协调另一个对象的行为机制.例如当你用一个tableView,你必须实现他里面的一个tableView ...

  5. IOS UI 第三篇:基本UI

    工厂模式:   .h文件:   #import <Foundation/Foundation.h>typedef enum{    QFRed,    QFYellow,    QFBlu ...

  6. php设计模式笔记--总结篇

    一.引入  设计模式的一般定义不再说,只大概说一下我理解的设计模式,我理解的设计模式的主要目的是利用面向对象(类.接口等)特点,让代码更加易于扩展,易于重用,易于维护.这三个特点也就要求我们不要将太多 ...

  7. JAVA设计模式---总述篇

    一.设计模式(Design Pattern): 1.设计模式的概念 是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及 ...

  8. 小菜学习设计模式(三)—工厂方法(Factory Method)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  9. .NET设计模式(12):外观模式(Façade Pattern)(转)

    概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依 ...

随机推荐

  1. C++多线程中调用python api函数

    错误场景:一直等待全局锁. 解决方法: 一.首先定义一个封装类,主要是保证PyGILState_Ensure, PyGILState_Release配对使用,而且这个类是可以嵌套使用的. #inclu ...

  2. (转)live555学习笔记-UsageEnvironment和TaskScheduler

    2011-12-6阅读1264 评论1 一直想学习流媒体服务器的设计,这几天有点时间,看了一下live555的源代码.live555是一个开源的跨平台流媒体服务器,使用编程语言是C++.将现阶段学习笔 ...

  3. ELK filter过滤器来收集Nginx日志

    前面已经有ELK-Redis的安装,此处只讲在不改变日志格式的情况下收集Nginx日志. 1.Nginx端的日志格式设置如下: log_format access '$remote_addr - $r ...

  4. Making ARC and non-ARC files play nice together

    From Codeography If you want to exclude a file from being compiled with ARC you can do so by setting ...

  5. Bulestacks模拟器Bulestacks.prop文件里中英文对照表

    打开“Bulestacks.prop”文件后可以看到以下内容,根据中英文对照表来修改即可. # begin build properties (开始设置系统性能)# autogenerated by ...

  6. EasyUI的功能树之扁平化

    上篇博客主要介绍了异步加载树的方法,通过前台传给后台一个节点的id值,然后当单击节点加号时,查询并显示其子节点的数据.其实如果不是很大的数据,我们本可以次把树中所有节点都加载上来的.也就是说,我的Ac ...

  7. webService(SOAP)性能测试脚本

    本文以天气预报的webService为基础进行学习   webService地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx ...

  8. tomcat启动时设定环境变量

    在tomcat的bin目录中修改startup.bat 设置CATALINA_HOME set "CATALINA_HOME=F:\solr\apache-tomcat\apache-tom ...

  9. MathType调整矩阵分隔线粗细的方法

    矩阵是线性代数的重要的组成部分,对于矩阵的计算,一般会先找一些规律再进行计算这样会更加方便.对于比较复杂的矩阵,在寻找规律时经常会将矩阵进行分割,我们将这种矩阵称为分块矩阵.有时为了表示矩阵的这种分块 ...

  10. SpringBoot------连接mysql时出现警告:Establishing SSL connection without server's identity verification is not recommended

    SpringBoot连接MySQL时出现警告: 英文: Mon Jun :: CST WARN: Establishing SSL connection without server's identi ...