外观设计模式:

这个外观设计模式提供了一个单独的接口给复杂的子系统。而不是暴露用户的一组类和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. e779. 获得JList中的已选项

    The following methods return the indices of the selected items: // To create a list, see e774 创建JLis ...

  2. EF + MySql 错误:配置错误 无法识别的元素“providers”

    “/”应用程序中的服务器错误. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的元素“providers” ...

  3. unity提高----------射线使用【unity3d 怎样获得当前鼠标点击的对象】

    unity3d 怎样获得当前鼠标点击的对象 最佳答案   var ray = Camera.main.ScreenPointToRay (Input.mousePosition);var hit : ...

  4. unity---各种资源对应的格式

    我们打包AssetBundle后,Unity3D会根据文件的后缀名将文件转换为特定的类型对象存储起来,我们后期获取时需要根据这些类型取出打包的数据,这里记录下不同后缀文件打包后的类型. 文本格式 支持 ...

  5. CentOS7环境RabbitMQ集群配置管理

    CentOS7系统内核版本:3.10.0-514.26.2.el7.x86_64 一.对应主机host地址(三台主机host文件要保持一致) 10.100.2.10 v01-app-rabbitmq0 ...

  6. phpmyadmin配置文件权限错误,不应任何用户都能修改

    访问phpmyadmin提示“配置文件权限错误,不应任何用户都能修改” 原因:phpmyadmin目录权限过高,设置了777访问权限 解决: $ phpmyadin 转自: http://www.it ...

  7. hql date比较

    补充:相等时用to_char,比较大小(<或>)时用 时间格式(如果不是时间格式可以用to_date) java.util.Date date=new java.util.Date(); ...

  8. 基于PHP采集数据入库程序(一)

    前几天有一朋友要我帮做一个采集新闻信息的程序,抽了点时间写了个PHP版本的,随笔记录下. 说到采集,无非就是远程获取信息->提取所需内容->分类存储->读取->展示 也算是简单 ...

  9. 将windbg设置为默认调试器命令

    前提条件:安装好windbg软件(默认安装位置) 以截取组态王运行系统崩溃为例: 64位系统0.文件更新替换 将Touchvew.exe以及Touchvew.pdb覆盖替换C:\Program Fil ...

  10. Java正则表达式的使用和详解(下)

    1.常用正则表达式 规则 正则表达式语法   一个或多个汉字 ^[\u0391-\uFFE5]+$  邮政编码 ^[1-9]\d{5}$ QQ号码 ^[1-9]\d{4,10}$  邮箱 ^[a-zA ...