iOS常用设计模式之委托模式

委托模式在Cocoa Touch框架和Cocoa框架中都有很多的应用。例如在应用启动的时候需要的一个类:UIApplication。在程序的入口函数main函数里面:

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([WBAppDelegate class]));
    }
}

UIApplication的方法UIApplicationMain函数设置了它的委托类:WBAppDelegate。UIApplication不直接依赖于WBAppDelegate类,而是依赖于UIApplicationDelegate协议,WBAppDelegate类实现协议UIApplicationDelegate,WBAppDelegate是一个委托类。

委托是为了降低一个对象的复杂度和耦合度,使其能够更具通用性而将一些处理置于委托对象中得编码方式。通用类因为通用性而变成框架类,框架类保持委托对象的指针,并在特定的时刻向委托对象发送消息。消息可能只是通知委托对象做一些事情,也可能是对委托对象的控制。

下面通过一个班主任老师和班长的例子来介绍一下委托模式的实现原理和应用场景。老师(Teacher)为了更好的管理班级需要任命一位同学为班长(Monitor),老师希望班长能帮助他做两件事情:

1、发布一些信息(sendMessage)

2、收集同学们的一些情况(collectSomething)

也就是说,老师为了更好地工作,需要将这两件事情委托给班长来做,然而要成为班长,需要实现一个协议,这个协议要求能够处理“发布一些信息”和“收集同学们的一些情况”。先定义一个Teacher类:

#import @protocol WBTeacherDelegate

@required
- (void)sendMessage;
- (void)collectSomething;

@end

@interface WBTeacher : NSObject

@property (nonatomic, weak) id delegate;

@end
//
//  WBTeacher.m
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/22.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import "WBTeacher.h"

@implementation WBTeacher

@end

Teacher类就是上面所说的通用类,它通过delegate属性保持委托对象的引用,委托对象就是班长,他需要实现协议WBTeacherDelegate。WBTeacherDelegate协议规定了两个方法:sendMessage和collectSomething。

下面来实现班长类:

//
//  WBMonitor.h
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/22.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import #import "WBTeacher.h"

@interface WBMonitor : NSObject @end
//
//  WBMonitor.m
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/22.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import "WBMonitor.h"

@implementation WBMonitor

- (id)init {
    self = [super init];

    WBTeacher *teacher = [[WBTeacher alloc] init];
    teacher.delegate = self;
    [teacher doSomething:0];
    [teacher doSomething:1];

    return self;
}

- (void)sendMessage {
    NSLog(@"monitor:send message...");
}

- (void)collectSomething {
    NSLog(@"monitor:collect something...");
}

@end

然后修改一下Teacher类:

//
//  WBTeacher.h
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/22.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import @protocol WBTeacherDelegate

@required
- (void)sendMessage;
- (void)collectSomething;

@end

@interface WBTeacher : NSObject

@property (nonatomic, weak) id delegate;

- (void)doSomething:(int)tag;

@end

//
//  WBTeacher.m
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/22.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import "WBTeacher.h"

@implementation WBTeacher

- (void)doSomething:(int)tag {
    if (!_delegate) {
        return;
    }
    switch (tag) {
        case 0:
            [_delegate sendMessage];
            break;
        case 1:
            [_delegate collectSomething];
            break;
        default:
            break;
    }
}

@end

可以看到,委托协议WBTeacherDelegate定义了两个方法,他得实现类是WBMonitor。WBTeacher类中定义doSometing:方法是为了调试方便模拟老师向班长发送消息的方法。

委托对象和通用类通过WBMonitor类中的init方法中的teacher.delegate = self来建立关系。调试输出内容如下:

2015-06-22 09:08:47.991 DesignPatternsDemo[26365:607] monitor:send message...
2015-06-22 09:08:47.993 DesignPatternsDemo[26365:607] monitor:collect something...

附WBTeacher和WBMonitor类的下载地址:委托模式

时间: 2024-10-15 22:32:00

iOS常用设计模式之委托模式的相关文章

iOS.常用设计模式.02.委托模式

WTDelegate #import <Foundation/Foundation.h> @protocol WTDelegate <NSObject> @required - (void)sleep; - (void)eat; - (void)work; @end WTPhilosopher.h #import <Foundation/Foundation.h> #import "WTDelegate.h" @interface WTPhiloso

iOS.常用设计模式.01.单例模式

使用单例模式的类: UIApplication UIAccelerometer NSUserDefaults NSNotificationCenter NSFileManager NSBundle等 Singleton.h #import <Foundation/Foundation.h> @interface Singleton : NSObject // 始终返回同一个Singleton的指针 + (Singleton *)sharedManager; @property (strong,

java常用设计模式之 工厂模式

工厂模式: 定义 一个用于创建对象的接口,让子类决定实例化哪一个类. 一句话概括: 是一个类的实例化延迟到其子类.     适用于 以下情况: ①:当一个类 ,不知道它所必须创建的对象的类的时候. ②:当一个类,希望由它的子类来指定它所创建的对象的时候. ③:当类将创建对象的职责给多个帮助子类中的一个,并且希望将哪一个帮助子类是代理这一信息局部化的时候. 说明: ① Product :定义工厂方法所创建的对象的接口. ② ConcreteProduct:实现Product 接口. ③ Creat

IOS常用设计模式——委托模式(IOS开发)

委托模式在之前的博客中用到了很多,比如各种复杂的Cocoa Touch框架的UI控件,几乎都用到了委托来响应控件事件或控制其他对象. 委托模式 -问题: 处理一切IOS应用都在UIApplication中完成,但是在设计过程中并不友好,它藕合度高,职责不清,难以维护,需要不断不断的重构,因此需要把看似功能很复杂的类分解或者分派成功能明确的类. Apple中我们经常用两种类,一个是框架类,各种用,不断的用,啥都能用:另一个就是协议类,就是协议. 协议的目的,终究是降低一个对象的复杂度和藕合度.框架

IOS常用设计模式——单例模式(IOS开发)

IOS常用的设计模式包括:单例模式.委托模式.观察者模式和MVC模式. 这里主要讲单例模式 单例模式 -问题: 主要解决应用中只有一个实例的问题(只需要某个类的实例) -原理:一般会封装一个静态属性,并提供静态实例的创建方法 -应用:单例类 // Singleton.h @interface Singleton : NSObject + (Singleton *)sharedManager; @property (nonatomic, strong) NSString* stingletonDa

iOS开发指南 第8章 iOS常用设计模式 学习

设计模式是在特定场景下对特定问题的解决方案 1 单例模式 作用:解决“应用中只有一个实例”的问题,这个实例的作用是全局的,比如说是可以实现一些共享资源 方法的访问和状态的保持 实现原理:一般会封装一个静态属性,并提供静态实例的创建方法. *********** James Rumbaugh对类的定义是:类是具有相似结构.行为和关系的一组对象的描述符.类是面向对象系统中最重要的构造块.类图显示了一组类.接口.协作以及他们之间的关系. 建立类图的步骤: (1)研究分析问题领域确定系统需求. (2)确

PHP设计模式系列 - 委托模式

委托模式 通过分配或委托其他对象,委托设计模式能够去除核心对象中的判决和复杂的功能性. 应用场景 设计了一个cd类,类中有mp3播放模式,和mp4播放模式 改进前,使用cd类的播放模式,需要在实例化的类中去判断选择什么方式的播放模式 改进后,播放模式当做一个参数传入playList函数中,就自动能找到对应需要播放的方法. 代码:cd类,未改进之前,选择播放模式是一种痛苦的事情 <?php //委托模式-去除核心对象中的判决和复杂的功能性 //使用委托模式之前,调用cd类,选择cd播放模式是复杂的

php设计模式之委托模式

使用委托模式目的是消除潜在的.难以控制的if/else语句. <?php /** * 原来的程序写法 * @var playlist */ $playlist = new playlist(); $playlist->addSong('/home/aaron/music/aa.mp3', 'Brr'); $playlist->addSong('/home/aaron/music/bb.mp3', 'GoodBye'); if ($extType == 'pls') { $playlist

设计模式之委托模式

一:概念 一个对象接收到了请求,但是自己不处理,交给另外的对象处理,就是委托模式,例如 老板接到了活, 然后把活转手给了工人去做. 二:示例 创建一个类IReceiveTask,代表接收任务的动作 public interface IReceiveTask { void receive(String task); } 创建一个类BossService,老板可以接收任务,并且可以命令工人 public class BossService implements IReceiveTask{ priva