在objective-c中实现模板方法模式(template method)

原创 2013年12月02日 12:49:00

模板方法,是我原本在java开发中用得比较多的一种设计模式。最近在做IOS开发,也遇到一个很合适的场景,但是我不知道怎么在Objective-C中实现,因为没有abstract关键字,在网上搜索了一番,最后在stackoverflow中找到一种办法,本文记录一下:

首先是一个protocol,相当于java里的interface:

// 初始化脚本协议
@protocol YLSInitialScript <NSObject>

- (void) doInit:(YLSClientInfo*) clientInfo;

@end

然后定义一个抽象类,实现这个接口的总体框架性算法,但是具体的实现声明为抽象方法:

@interface YLSInitialScriptTemplate : NSObject<YLSInitialScript>

-(id) initOrigin:(YLSInitialOperator *)operator;

// 抽象方法,由子类实现
- (void) createEverythingForFirstTime;
- (void) update;
- (NSString*) stepMsg;

@end

@implementation YLSInitialScriptTemplate

YLSInitialOperator *origin;

-(id) initOrigin:(YLSInitialOperator *)operator
{
    origin = operator;
    return self;
}

- (void) doInit:(YLSClientInfo*) clientInfo
{
    if ([clientInfo shouldInit]) {
        [self createEverythingForFirstTime];// 无表,初始化
    } else if ([clientInfo shouldUpdate]) {
        [self update];// 升级
    }
    [origin notifyStepDone:[self stepMsg]];// 通知Bootstrap View Controller刷新进度条
}

// 以下3个是抽象方法,延迟到子类实现
- (void) createEverythingForFirstTime
{
    [self doesNotRecognizeSelector:_cmd];
}

- (void) update
{
    [self doesNotRecognizeSelector:_cmd];
}

- (NSString*) stepMsg
{
    [self doesNotRecognizeSelector:_cmd];
    return nil;
}

@end

最后是具体的子类,不需要重新实现协议里规定的doInit()方法,只要实现抽象类里的3个抽象方法就可以了:

@interface YLSServiceDataInitScript : YLSInitialScriptTemplate

@end

@implementation YLSServiceDataInitScript

- (void) createEverythingForFirstTime
{
    // 具体逻辑
}

- (void) update
{
}

- (NSString*) stepMsg
{
    // 具体逻辑
}

@end


语法没有java里这么清楚,关键就是在抽象类里用

[self doesNotRecognizeSelector:_cmd];

这行代码实现类似java中abstract关键字的效果

最后是实现调用的客户端代码:

        scripts = [NSMutableArray new];
        
        // 需要执行的脚本依次添加在下面
        [scripts addObject:[[YLSShowDataInitScript new] initOrigin:self]];
        [scripts addObject:[[YLSServiceDataInitScript new] initOrigin:self]];
        [scripts addObject:[[YLSMemberDataInitScript new] initOrigin:self]];
        [scripts addObject:[[YLSBillDataInitScript new] initOrigin:self]];
        [scripts addObject:[[YLSEmployeeDataInitScript new] initOrigin:self]];
        [scripts addObject:[[YLSBackupDataInitScript new] initOrigin:self]];

for (int i = 0; i < [scripts count]; i++) {
        [[scripts objectAtIndex: i] doInit:clientInfo];
    }

stackoverflow原文见:

template method pattern in Objective-C

abstract class in Objective-C

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

iOS 消息(即方法调用)的两个隐藏参数 :self 和 _cmd

iOS 消息(即方法调用)的两个隐藏参数 :self 和 _cmd
  • sleks
  • sleks
  • 2014年05月08日 08:43
  • 1790

OC实战: 抽象类的实现

这里, 假设你已经明白了 * oc 的继承. * oc 的多态.其实 oc 里面的方法都是虚方法. * oc 的协议 protocol. -------------------------------...

《Objective-C编程全解》 读书笔记 第十一章 抽象类

《Objective-C编程全解》 读书笔记 第十一章 抽象类

Objective C 模板方法模式

模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。    下面和给大家展示一下类的结构图: ...

Objective-C 单例模式写法以及单例模式模板宏

Objective-C Singleton 单例模式解析,单例模式就是只有一个实例,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。   objective c ...

IOS 项目配置--构建输出DIR

通常在情一般都不建议使用绝对路径,因为写死之后,换环境,换平台,又要重新修改路径,因此常常使用相对路径,哪么相对路径通常使用的就是环境变量了。 在Mac 中,xcode 中build set...

为iPhone6设计自适应布局(纯代码实现)

目前网络上已经有很多关于AutoLayout的讲义可供大家学习,大部分的Demo都是通过IB或者Storyboard上完成的。很多人也在思考,到目前iOS 8这个版本,使用代码来实现UI布局是不是合适...

我所理解的设计模式(C++实现)——模板方法模式(Template Method Pattern)

概述:      我们最近在开发一个支持多种压缩类型文件的解压缩且制作成pdf的一个应用。对我们的架构来说我们需要支持多种压缩文件类型,但却有固定的操作顺序(先解压缩,在读取里面的文件分析、制作pd...

模板方法模式【Template Method Pattern】

模板方法模式【Template Method Pattern】 周三,9:00,我刚刚坐到位置,打开电脑准备开始干活。 “小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑。还不等...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在objective-c中实现模板方法模式(template method)
举报原因:
原因补充:

(最多只允许输入30个字)