外观设计模式:

这个外观设计模式提供了一个单独的接口给复杂的子系统。而不是暴露用户的一组类和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. ibatis中的安全问题

    http://blog.csdn.net/yangqillohe/article/details/4139265

  2. 架构师素养及从小菜进阶架构(CTO)的书籍【转】

    CTO要了解无线技术/搜索/大数据/数据库等. -- 通常定义架构有几个层次,这包括业务架构.产品架构.应用架构和技术架构: 1.业务架构:描述一个企业围绕一个行业做了哪些业务,例如支付行业的收单.退 ...

  3. JSP九大内置对象与Servlet学习笔记[转]

    我们常说的JSP有九大内置对象分别为:request.response.session.out.pagecontext.page.exception.application.config. 我们知道, ...

  4. MATLAB:保存mat文件

    X_Y_pred_00_0000.mat里存有三个mat文件: 另存:

  5. Python爬虫学习——获取网页

    通过GET请求获取返回的网页,其中加入了User-agent信息,不然会抛出"HTTP Error 403: Forbidden"异常, 因为有些网站为了防止这种没有User-ag ...

  6. 使用 StoryBoard 实现左右按钮切换图片的浏览效果

    关键技能:使用故事板进行布局时,点击选中控件(组件)并按住 control 键向某个方向拖动,产生一条实线,然后弹出的窗口可以设置控件(组件)的布局约束条件:从而实现自动布局 AutoLayout 效 ...

  7. Linux系统下wetty安装和使用说明

    1. Wetty简介 Wetty是使用Node.js和websockets开发的一个开源Web-based SSH.关于Web-based SSH的更多资料请参考https://en.wikipedi ...

  8. 组合模式(Composite Pattern) ------------结构型模式

    组合模式使用面向对象的思想来实现树形结构的处理和构件,描述了如何将容器对象和叶子对象进行递归组合,实现简单,灵活性好. 组合模式(Composite Pattern):组合多个对象形成树形结构以表示具 ...

  9. android 转屏 onConfigurationChanged 不会执行的问题

    参考 http://blog.csdn.net/tangzhilu/article/details/7399988 MainActivity 代码 package com.example.config ...

  10. Android Call(打电话)的基本知识详解