`

iOS开发那些事-iOS常用设计模式–委托模式

阅读更多

对于iOS开发,举例Cocoa框架下的几个设计模式为大家分析。当然,Cocoa框架下关于设计模式的内容远远不止这些,我们选择了常用的几种:单例模式、委托模式、观察者模式、MVC模式。

 

 

 

委托模式

 

委托模式从GoF 设计装饰(Decorator)、适配器(Adapter)和模板方法(Template Method)等模式演变而来。几乎每一个应用都会或多或少地使用到委托模式。不只是CocoaTouch框架,在Cocoa框架中委托模式也得到了广泛的应用。

 

问题提出

 

1

 

对于应用生命周期的非运行状态——应用启动场景,我们把从点击图标到第一个画面启动的过程细化了一下

 

假设上图这一系列的处理,都是在一个上帝类UIApplication完成的。之所以叫“上帝类(God Class)”,是因为它“无所不能”、“包含所有”。 在面向对象的软件设计中“上帝类”不是很友好, 需要重构。在编程过程中要尽量避免上帝类的使用,因为上帝类是高耦合的,职责不清,所以难以维护。我们需要“去除上帝类”,把看似功能很强且很难维护的 类,按照职责把自己的属性或方法分派到各自的类中或分解成功能明确的类,从而去掉“上帝类”。

 

幸运的是苹果没有把UIApplication类设计成“上帝类”,苹果处理分割到两个不同的角色类中,其中一个扮演框架类角色,框架类具有通用、 可重复使用、与具体应用无关等特点。另一个扮演应用相关类的角色,应用相关类与具体应用有关,由于要受到框架类的控制,常常被设计成为“协议”,在 Java中称之为“接口”。开发人员需要在具体的应用中实现这个“协议”。

 

将application:didFinishLaunchingWithOptions:和 applicationDidBecomeActive:完成功能提取出来,定义在UIApplicationDelegate协议中,这样 UIApplication类就变成了框架类。

 

2

 

在具体使用时候需要实现UIApplicationDelegate协议,HelloWorld应用的类图。UIApplication不直接依赖 于AppDelegate类,而是依赖于UIApplicationDelegate协议,这在面向对象软件设计原则中叫做“面向接口的编程”。 AppDelegate类实现协议UIApplicationDelegate,它是委托类。

 

3

 

我们给出委托的定义,委托是为了降低一个对象的复杂度和耦合度,使其能够更具通用性将其中一些处理置于委托对象中的编码方式。通用类因为通用性即与 具体应用的无关性而变为框架类,框架类保持委托对象的引用,并在特定时刻向委托对象发送消息。消息可能只是通知委托对象做一些事情,也可能是对委托对象进 行控制。

 

实现原理

 

我们通过一个案例介绍委托设计模式实现原理和应用场景,重新绘制委托设计模式类图。

 

4

 

在古希腊有一个哲学家,他毕生只做三件事情:“睡觉”、“吃饭”和“工作”。为更好的生活,工作效率更高,他会找一个徒弟,把这些事情委托给徒弟做。然而要成为他的徒弟,需要实现一个协议,协议要求能够处理“睡觉”、“吃饭”和“工作”问题。 三者之间的关系。

 

5

 

哲学家类图中, 通用类(Philosopher)保持指向委托对象(ViewController)的“弱引用” (id<PhilosopherDelegate> delegate),委托对象(ViewController)就是哲学家的“徒弟”,他实现了协议 PhilosopherDelegate,PhilosopherDelegate规定了3个方法:-(void) sleep、-(void) eat和-(void) work方法。

 

下面我们看看实现代码,委托协议PhilosopherDelegate.h代码如下:

 

@protocol PhilosopherDelegate

@required

-(void) sleep;

-(void) eat;

-(void) work;

@end

 委托协议PhilosopherDelegate定义了3个方法,协议没有m文件,它的定义可以放在别的h文件中。它的实现类就是委托类ViewController的代码如下:

 

//

//  ViewController.h

//

@interface ViewController : UIViewController<PhilosopherDelegate>

@end

//

//  ViewController.m

//

@implementation ViewController

- (void)viewDidLoad

{

    [super viewDidLoad];

    Philosopher *obj = [[Philosopher alloc ] init];

    obj.delegate = self;

    [obj start];

}

#pragma — PhilosopherDelegate 方法实现

-(void) sleep

{

    NSLog(@”sleep…”);

}

-(void) eat

{

     NSLog(@”eat…”);

}

-(void) work

{

     NSLog(@”work…”);

}

@end

 

 

 

委托对象如何与通用类建立引用关系呢?我们通过viewDidLoad方法中的obj.delegate = self语句来指定委托对象和通用类间的引用关系。 一般情况下通用类由框架直接提供,在这个例子中我们根据需要自己实现了通用类Philosopher,Philosopher.h的代码:

 

//

//  Philosopher.h

//  DelegatePattern

//

#import “PhilosopherDelegate.h”

@interface Philosopher : NSObject

{

    NSTimer *timer;

    int count;

}

@property  (nonatomic, weak) id<PhilosopherDelegate> delegate;

-(void) start;

-(void) handle;

@end

 

 

 

Philosopher.h中定义delegate属性,它的类型是id<PhilosopherDelegate>,它可以保存委托对象的引用,属性weak说明是“弱引用”。Philosopher.m文件代码如下:

 

//

// Philosopher.m

//  DelegatePattern

#import “Philosopher.h”

@implementation Philosopher

@synthesize delegate;

-(void) start

{

    count= 0;

    timer = [NSTimer scheduledTimerWithTimeInterval:3.0

               target:self selector:@selector(handle)userInfo:nil repeats:YES];

}

-(void)handle

{

    switch (count)

    {

        case 0:

            [self.delegate sleep];

            count++;

            break;

        case 1:

            [self.delegate eat];

            count++;

            break;

        case 2:

            [self.delegate work];

            [timer  invalidate];

            break;

    }

}

@end

 

 

 

在本例中Philosopher模拟一些通用类发出调用,这个调用的发出是通过NSTimer每3秒发出一个,依次向委托对象发出消息sleep、 eat和work。代码中self.delegate是指向委托对象ViewController的引用,[self.delegate sleep]是调用ViewController中的sleep方法。

分享到:
评论

相关推荐

    ios-超简单的设计模式MVP例子.zip

    在iOS开发中,设计模式是一种解决常见编程问题的模板或最佳实践,可以帮助开发者编写可维护、可扩展的代码。在这个“ios-超简单的设计模式MVP例子”中,我们将探讨Model-View-Presenter(MVP)模式,这是一种常用于...

    Objective-C面向对象编程与设计模式详解:iOS开发基础

    使用场景及目标:适用于希望深入了解 Objective-C 面向对象编程和设计模式的开发者,通过理论和实践相结合的方式提升 iOS 应用开发技能。 其他说明:文章不仅涵盖基础理论,还提供了大量代码示例,帮助读者更好地...

    IOS 设计模式委托模式实例Demo

    委托模式(Delegate Pattern)是iOS开发中最常用的设计模式之一,它允许一个对象(委托对象)代表另一个对象(委托者)执行某些操作。这种模式在iOS中的应用非常广泛,比如UITableView的数据源和代理方法、UIWebView...

    iOS 设计模式及源码实现

    通过阅读“IOS设计模式解析电子书+源代码”,开发者可以更好地理解和运用这些设计模式,提高代码质量和开发效率。实际的源码实现部分对于加深理解、实践应用以及解决实际问题有着极大的帮助。在iOS开发过程中,熟练...

    iOS设计模式——委托(delegate)例子

    在iOS开发中,设计模式是实现高效、可维护和可扩展代码的关键元素。本文将重点关注“委托”(Delegate)设计模式,这是一种常见的模式,用于在对象之间建立通信和协调行为。通过实现委托,一个对象(委托者)可以...

    IOS应用源码Demo-委托代理-毕设学习.zip

    在iOS应用开发中,委托代理(Delegate)是一种重要的设计模式,它使得对象间可以进行通信,特别是当一个对象需要依赖另一个对象的行为时。这个压缩包"IOS应用源码Demo-委托代理-毕设学习.zip"显然是为了帮助学习者...

    iOS开发例程-QQUITableView

    在iOS开发中,UITableView是一个至关...在这个过程中,你会接触到数据源和委托的设计模式,单元格的自定义,以及与用户交互的处理,这些都是iOS开发中的核心技能。通过这个实践项目,你的iOS开发能力将得到显著提升。

    ios 设计模式

    ### iOS设计模式详解 #### 一、单例模式 单例模式是一种常用的设计模式,它的主要目的是确保一个类仅有一个实例,并且该实例能够被全局访问。这种模式非常适合那些需要频繁访问并保持状态一致的对象,比如全局配置...

    ios设计模式开发

    在iOS开发中,设计模式是一种重要的编程思想,它可以帮助开发者创建可维护、可扩展和可重用的代码。设计模式是解决常见问题的最佳实践,经过时间的检验,被广泛接受和应用。本压缩包文件“设计模式学习”显然是一个...

    IOS开发的六种设计模式共2页.pdf.zip

    在iOS开发中,设计模式是一种解决常见编程问题的标准化方法,它们是经验丰富的开发者们在实践中提炼出的最佳实践。这份“iOS开发的六种设计模式共2页.pdf”压缩文件,虽然只涵盖两页内容,但很可能会介绍到iOS开发中...

    Objective-C编程之道IOS设计模式解析pdf文档及源码

    《Objective-C编程之道:iOS设计模式解析》是一本深度探讨iOS开发中设计模式的书籍,其PDF文档结合了源码,旨在帮助开发者更好地理解和应用设计模式。设计模式是软件工程中的一种最佳实践,它们是为了解决常见问题而...

    IOS开发入门介绍.pdf

    委托模式是IOS开发中常用的设计模式,用于处理事件和回调函数。在本文档中,我们将详细介绍@protocol的使用和委托模式的应用。 Timer应用 Timer是IOS开发中常用的计时器机制,用于实现定时任务和延迟执行。开发者...

    IOS应用源码Demo-仿苹果音乐播放器的歌曲封面滑动效果-毕设学习.zip

    通过研究这个源码,学习者可以深入理解iOS UI开发中的滚动视图、数据源和委托模式,以及如何实现自定义布局和手势识别。同时,它还能帮助理解图片加载优化和动画效果的应用,这些都是iOS应用开发中的重要技能。这个...

    Objective-C编程之道 iOS设计模式解析

    《Objective-C编程之道:iOS设计模式解析》是人民邮电出版社出版的一本深入探讨Objective-C编程技巧和iOS设计模式的专业书籍。这本书旨在帮助开发者更好地理解和掌握Objective-C这门语言,同时通过深入研究iOS设计...

    IOS应用源码Demo-表格菜单TableMenu-毕设学习.zip

    - MVC(Model-View-Controller)设计模式的应用。 - 如何加载和显示数据,可能涉及到网络请求或本地数据存储。 - 如果涉及第三方库,还可以学习如何集成和使用它们。 总之,"IOS应用源码Demo-表格菜单TableMenu-...

    Objective-C编程之道 IOS设计模式解析

    《Objective-C编程之道 iOS设计模式解析》是一本深入探讨Objective-C编程技术和iOS设计模式的专业书籍。本书旨在帮助iOS开发者提升编程技巧,理解并熟练运用设计模式来构建高效、可维护的iOS应用程序。27.7 MB的资源...

    IOS 委托模式KVO实例Demp

    在iOS开发中,委托模式(Delegate Pattern)和关键值观察(Key-Value Observing, KVO)是两种常用的设计模式,它们在实现组件间的通信和数据绑定时发挥着重要作用。让我们详细了解一下这两种模式以及如何在实际项目...

    OBJECTIVE-C编程之道 IOS设计模式解析

    本书“Objective-C编程之道:iOS设计模式解析”深入探讨了如何在iOS开发中有效地应用Objective-C语言,以及如何利用设计模式提升代码质量和可维护性。 一、Objective-C基础 Objective-C的基础包括类、对象、消息...

    IOS应用源码Demo-图片拾取器-毕设学习.zip

    5. **MVVM(Model-View-ViewModel)设计模式**:现代iOS开发常采用MVVM来组织代码结构,提高可测试性和可维护性。理解模型、视图和视图模型之间的关系对分析源码大有裨益。 6. **Delegate和Closure**:在图片选择...

    iOS学习笔记3---delegate五步曲,轻松学会使用delegate

    在iOS开发中,Delegate是一种非常重要的设计模式,它允许对象之间进行通信,使得一个对象能够对另一个对象的行为进行响应。本篇文章将通过“delegate五步曲”,帮助你深入理解并熟练掌握如何在iOS应用中使用Delegate...

Global site tag (gtag.js) - Google Analytics