SlideShare a Scribd company logo
1 of 36
iOS 设计模式简介
• 设计模式的概念
• iOS中常见的设计模式
• 例子和使用场景
设计模式的概念

特定环境下的特定问题的解决方案
为何要用设计模式

•

更易于复用与扩展

•

更易于变更

•

优雅和高效
Cocoa 框架中的设计模式
Cocoa 环境的很多架构和机制都有效地使用
了设计模式 : 即为特定上下文中反复出现的
问题提供解决方案的抽象设计。
iOS 中常见的设计模式

•
•

模型-视图-控制器(MVC)
适配器
o
o

•

协议( protocal )
范畴( category )

观察者
o
o

•
•

通告( Notification )
键-值观察( KVO )

代理
单例
模型-视图-控制器( MVC )

•
•
•
•

一个相当老的设计模式( Smalltalk 早期)
高级别的模式,关注全局架构
复合的模式(由几个更加基本的模式组成)
面向对象的程序采用 MVC 的好处
o

对象更具重用性

o

接口定义更加良好

o

更加容易扩展

o

Cocoa 中很多技术和架构都基于 MVC ,要求定制对
象充当 MVC 定义的某种角色
MVC 对象的作用和关系

•
•
•
•

模型( Model )负责包装数据和基本行为
视图( View )负责向用户表示信息
控制器( Controller )连接模型和视图
组合角色
Cocoa 控制器对象的类型

•

仲裁控制器:
o
o

Cocoa 绑定技术中用到

o

•

通常是从 NSController 类继承而来
负责为 V 和 M 之间的数据流提供仲裁或支持

协调控制器:
o

通常是一个 NSWindowController 或
NSDocumentController 对象,或 NSObject 定制子类
的实例

o

检查(协调)整个或部分应用程序是否正常工作
复合的设计模式
在原来的( Smalltalk )概念上, MVC 是由合成
( Composite )、策略( Strategy )和观察者
( Observer )模式组成的。
• 合成模式: V 是多个嵌套视图的集合
• 策略模式:一个 C 负责一或多个 V 的策略
• 观察者模式: M 将状态变化通知其他感兴趣的对

象(通常是 V )
传统版本的 MVC 是一个复合设计模式
Cocoa 版本的 MVC 也是一种复合设计模式
MVC 应用程序的设计原则

•
•
•

没有理由重新实现一个仲裁控制器

•

视图对象应该总是通过仲裁控制器对象来了
解模型对象的变化

•
•

在总体上最好的策略还是保持角色的分离
尽可能多地使用 ( 至少在理论上 ) 可重用的对
象

努力限制应用程序中类代码的依赖关系
如果 Cocoa 提供的架构已经将 MVC 角色
分配给具体类型的对象 , 则直接使用该架构
MVC 交互示意图
Cocoa 中的模型-视图-控制器

•
•
•
•
•

文档架构
绑定技术
应用程序的脚本能力
Core Data
Undo
适配器

•
•

包装器模式

解决接口不兼容的问题
把被适配者的行为传递到管道另一端的客户
端

•

基本上有 2 种方式
o

类适配器

o

对象适配器
1. 类适配器

•

需要有定义了客户端要使用的一套行为的协
议

•
•

用具体的适配器类来实现这个协议
适配器类同时也要继承被适配者
2. 对象适配器

•

不继承被适配者,组合了一个对它的引用
类适配器 对象适配
器
只针对单
一的具体
Adaptee
类,把
Adaptee
适配到
Target

可以适配
多个
Adptee 及
其子类

易于重载
Adaptee
的行为,
因为是通
过直接的
子类化进

难以重载
Adaptee
的行为,
需要借助
于子类的
对象而不
在 Cocoa 框架中的应用
代理 / 委托 (delegation)
把类的接口变换为客户端要求的另一种接口

程序中的
其他类

Cocoa Touch
框架中的类

委托协议
块 (block)

•

闭包 (closure)

几乎可以在任何地方进行块的定义,然后让
接收器在以后使用它

•
•
•
•

不影响所涉及类的任何继承
跟协议与类相比,使代码和结构更加简洁
取代回调
许多流行的开源库使用 block 来取代代理方法
观察者

发布 / 订阅模
式

描述:

•

定义了一种一对多的依赖关系

•

当一个对象的状态发生改变时,所有依赖于
它的对象都得到通知并被自动更新
什么时候使用

•

主题的改变需要让所有有关的对象知道,但
是不知道这些对象的数量和具体类型

•

改变发生在同一个对象中,并在别的地方需
要将相关状态进行更新
实现方法

1. Notification
2. KVO ( Key-Value Observing )
3. 标准方法
1. Notification

•
•
•

// 推送通知
使用了操作系统的功能
[[NSNotificationCenter defaultCenter]
postNotificationName:@"login" object:nil];

对象间可以不认识
// 添加观察者接收通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(loadUserID) name:@"login" object:nil];
Cocoa Touch 框架提供了一些类,开发者不

必写自己的类
2. KVO (Key-Value Observing)

•
•

某个对象中的特定属性发生了改变,别的对
// 注册
-(void)addObserver:(NSObject *)anObserver forKeyPath:
象可以获得通知 options:
(NSString *)keyPath
(NSKeyValueObservingOptions)options context:
Cocoa 框架功能,基于 KVC (Key-value
(void*)context

coding)
// 实现响应

•

-(void)observeValueForKeyPath:(NSString *)keyPath
KVO/KVC 实现机理分析
ofObject:(id)object change:(NSDictionary *)change
context:(void *)context
3. 标准方法

•
•

主题知道所有的观察者,但是不知道它们的
类型
自己创建 Subject 和 Observer 的协议
单例
描述:

•

一个类只有一个实例对象

•

提供一个全局的入口点对这个实例对象进行
访问
何时使用

•

类只能有一个实例,且必须从一个熟悉的访
问点对其进行访问

•

这个唯一的实例只能通过子类化进行扩展,
而且扩展的对象不会破坏客户端代码
实现

•

程序启动的时候,会调用 UIApplicationMain 方法,实
例化一个 UIApplication 对象。之后在程序中的任意地
方调用 sharedApplication 方法都将返回一个与当前应
用程序相关的 UIApplication 实例( UIApplicationMain
方法中创建的 UIApplication 单例)

iOS SDK 中许多类使用了单例,如
+ (AFIHClient *)sharedClient:(NSString *)path
{

static AFIHClient *_sharedClient = nil;
static dispatch_once_t onceToken; // 进程锁
dispatch_once(&onceToken, ^{
// 最多调用一次
_sharedClient = [[AFIHClient alloc] // 第一次会调用 init
initWithBaseURL:[NSURL URLWithString:KAFUrl]];
});
... ....
return _sharedClient;
}

UIApplication, NSUserDefaults,
NSNotificationCenter...

•

『趣读』和『 Iamhere 』的网络通信方法
例子和应用场景
问题
?

More Related Content

Similar to iOS 设计模式简介

Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Justin Lin
 
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲ChinaNetCloud
 
Share module
Share moduleShare module
Share moduledpf2e
 
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Kirk Chen
 
Thought works design pattern jiukun zhang
Thought works design pattern   jiukun zhangThought works design pattern   jiukun zhang
Thought works design pattern jiukun zhangJiuKun Zhang
 
微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open Camp微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open CampAndrew Wu
 
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器Chieh Kai Yang
 
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4Duran Hsieh
 
N-layer design & development
N-layer design & developmentN-layer design & development
N-layer design & developmentXuefeng Zhang
 
移动端跨平台技术原理
移动端跨平台技术原理移动端跨平台技术原理
移动端跨平台技术原理gorillazf
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介pan weizeng
 
08 gaming framework design based on cocos2d-x
08   gaming framework design based on cocos2d-x08   gaming framework design based on cocos2d-x
08 gaming framework design based on cocos2d-x乐费 胡
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
Angular從入門到實戰(二)
Angular從入門到實戰(二)Angular從入門到實戰(二)
Angular從入門到實戰(二)志龍 陳
 
Azure 迁移之道
Azure 迁移之道Azure 迁移之道
Azure 迁移之道Tao Wang
 
Scrum敏捷开发示例
Scrum敏捷开发示例Scrum敏捷开发示例
Scrum敏捷开发示例Xiaoyan Chen
 
Full stack-development with node js
Full stack-development with node jsFull stack-development with node js
Full stack-development with node jsXuefeng Zhang
 

Similar to iOS 设计模式简介 (20)

Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
 
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
 
Share module
Share moduleShare module
Share module
 
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016
 
Dpl in action
Dpl in actionDpl in action
Dpl in action
 
Thought works design pattern jiukun zhang
Thought works design pattern   jiukun zhangThought works design pattern   jiukun zhang
Thought works design pattern jiukun zhang
 
微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open Camp微服務架構 導入經驗分享 吳剛志 - Community Open Camp
微服務架構 導入經驗分享 吳剛志 - Community Open Camp
 
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
 
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
 
Retina mac
Retina macRetina mac
Retina mac
 
N-layer design & development
N-layer design & developmentN-layer design & development
N-layer design & development
 
移动端跨平台技术原理
移动端跨平台技术原理移动端跨平台技术原理
移动端跨平台技术原理
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介
 
08 gaming framework design based on cocos2d-x
08   gaming framework design based on cocos2d-x08   gaming framework design based on cocos2d-x
08 gaming framework design based on cocos2d-x
 
課程規畫
課程規畫課程規畫
課程規畫
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
Angular從入門到實戰(二)
Angular從入門到實戰(二)Angular從入門到實戰(二)
Angular從入門到實戰(二)
 
Azure 迁移之道
Azure 迁移之道Azure 迁移之道
Azure 迁移之道
 
Scrum敏捷开发示例
Scrum敏捷开发示例Scrum敏捷开发示例
Scrum敏捷开发示例
 
Full stack-development with node js
Full stack-development with node jsFull stack-development with node js
Full stack-development with node js
 

iOS 设计模式简介

Editor's Notes

  1. 特定环境是指一个经常出现的环境,是设计模式应用的地方;问题是指在这个环境以及和这个环境与生俱来的约束下您希望达成的目标;而解决方案则是您关心的:一个可以在这个环境下达成目标、解决约束的一般性设计。
  2. Cocoa是苹果公司为Mac OS X所创建的原生面向对象的编程环境。Cocoa 应用程序一般在苹果公司的开发工具Xcode(前身为Project Builder)和Interface Builder上用Objective-C写成。Cocoa 是从1980年代由 NeXT 开发的编程环境 NeXTSTEP 和 OPENSTEP 演变而来,这点可由其类型之名皆以 NS 前缀(代表NeXTSTEP)看出端倪。
  3. 适配器:将一个类接口转化为客户代码需要的另一个接口。使原本由于兼容性而不能协同工作的类可以工作在一起,消除耦合性。 协议:由于两个对象的接口不兼容而导致交流困难,就可以定义一个协议,它本质上是一系列和类不相关联的方法声明。这样,其它对象的类就可以正式采纳该协议,并通过实现协议中的全部方法来“遵循”该协议。结果,客户对象就可以通过协议接口向其它对象发送消息。 代理:协议是一种编程语言级别的特性,提供了一个很方便的实现代理模式的机会。
  4. 仲裁控制器通常可以在IB中直接拖出,进行配置。改变V时新的值会通过它自动传递给M,M的属性值变化时又会传递给V 协调控制器提供如响应委托和对通告进行观察、响应动作、管理生命周期、建立对象间连接等服务
  5. 通过绑定技术,很容易创建一个Cocoa的MVC程序,让V直接观察M。V和M应该是程序中最具可重用性的对象。最好让M和V彼此分离,增加可重用性。
  6. 大多数Cocoa应用程序中,M的变化是通过C传递给V的。尽管多用了2个基本设计模式(命令、仲裁者),这种通讯机制显得清晰很多。
  7. 1. 用户操作,视图组合的某个层次接收,画布(M)将触摸消息传递给C;2. C收到消息和相关信息,应用策略变更M的状态;3. M通知观察者;4. C像个协调者,将变更了的数据从M传递给V,以便V相应的更新外观
  8. 最早在《设计模式》中,类适配器是通过多重继承实现的。在OC中可以实现协议,同时又继承超类,达到多重继承的效果
  9. 随处可见的代理(delegate)。对象适配器。
  10. 代理模式主要是适配器模式。
  11. 如同订阅报纸,你只需告诉出版社,然后就会收到每一期的新报纸。可以改变和取消订阅。