1 前言
委托模式是从装饰(Decorator)模式,适配器(Adapter)模式和模板方法(Template Method)模式等演变而来的。而且使用十分频繁,今天我们就来学习一下IOS开发中的委托模式。
转载请注明出处:http://blog.csdn.net/developer_zhang
2 详述
2.1 问题由来
对于应用生命周期的非运行状态启动应用场景,我们从点击图标到启动第一个界面的过程细化如图:
假设这一系列的处理都在UIApplication中完成的。那么它将无所不能。在面向对象软件设计中,这种类不是很友好,需要重构。在编程过程中,要尽量避免,因为它高耦合,职责不清,难以维护。我们需要去除掉,把看起功能很强大二期难以维护的类,按照职责将他的属性或者方法分派到各自的类中或者分解成功能明确地类。
苹果也是这么做的,它将这些功能分割到两个不同的角色中,一个扮演架构类角色,具有通用的,可重复使用,与具体应用无关的特点;另一个扮演应用相关类的角色,与具体应用有关。由于受到架构类控制,应用相关类常常设计为“协议”,在Java中也称作为“接口”。开发人员需要在具体的应用中实现这个协议。
如图所示,将一些功能提取出来放在application:didFinishLaunchingWithOptions:和applicationDidBecomeActive:方法中完成,定义在UIApplicationDelegate协议中,这样UIApplication类就变成了框架类。
在具体使用时,需要实现UIApplicationDelegate协议。类图如下:
UIApplication不直接依赖于AppDelegate类,而是依赖于UIApplicationDelegate协议,这再面向对象软件设计中叫做“面向接口的编程”。AppDelegate类实现协议UIApplicationDelegate,他是委托类。
委托是为了降低一个对象的复杂度和耦合度,使其更具有通用性而将其中一些处理置于委托对象中的编码方式。通用类因为通用性(与具体应用的无关性)而变为框架类,框架类保持委托对象的指针,并在特定时间向委托对象发送消息。消息可能只是委托对象做一些事情,也可能是对委托对象进行控制。
2.2 实现原理
委托设计模式类图如下:
2.3 代码实例
下面我们举一个实际应用的例子,现在有一个zhe'xue'jia,他会做三件事:睡觉,吃饭和工作。为了更好地生活,提高工作效率,他找一个学徒,把这些事情委托给徒弟做。要成为他的徒弟,需要实现一个协议,协议要求能够处理“睡觉”,“吃饭”和“工作”的问题。三者的关系如类图:
委托接口,哲学家接口:
#import <Foundation/Foundation.h>
/*!
* 委托接口,哲学家接口
*
* @since V1.0
*/
@protocol PhilosopherDelegate <NSObject>
@required
-(void)sleep;
-(void)eat;
-(void)work;
@end
通用(框架)类:
#import <Foundation/Foundation.h>
#import "PhilosopherDelegate.h"
/*!
* 通用(框架类)
*
* @since V1.0
*/
@interface Philosopher : NSObject{
NSTimer *timer;//计时器
int count;//统计数
}
//委托对象:属性使用弱引用,是为了防止内存引用计数增加而导致委托对象无法释放
@property(nonatomic,weak) id<PhilosopherDelegate> delegate;
/*!
* 开始执行计时器
*
* @since V1.0
*/
-(void)start;
/*!
* 处理方法
*
* @since V1.0
*/
-(void)handle;
@end
委托对象:
#import <UIKit/UIKit.h>
#import "Philosopher.h"
/*!
* 委托对象
*
* @since V1.0
*/
@interface ViewController : UIViewController<PhilosopherDelegate>
@end
在本例中,Phiosopher模拟一些通用类发出调用,通过NSTimer每3秒发出一个,向委托对象发消息。
3 结语
以上是所有内容,希望对大家有所帮助。