模板方法,是我原本在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
分享到:
相关推荐
用Objective-C语言实现了各种设计模式,收集各种例子,方便大家学习和普及设计模式。.zip用Objective-C语言实现了各种设计模式,收集各种例子,方便大家学习和普及设计模式。.zip用Objective-C语言实现了各种设计...
这儿的运行时系统扮演的角色类似于Objective-C语言的操作系统,Objective-C基于该系统来工作。本文档将具体介绍NSObject类以及Objective-C程序是如何和运行时系统交互的。特别地,本文档还给出来怎样在运行时动态地加
Objective-C语言的许多决策可以在编译和运行时执行。只要有可能,它是动态的。这意味着Objective-C语言不仅需要一个编译器,还需要一个运行时系统来执行编译的代码。Runtime系统是一种用于Objective-C语言的操作系统...
希望这个简单的Objective-C语言教程能够为你提供一个入门的起点。Objective-C是一种面向对象的编程语言,广泛应用于Mac OS和iOS开发。通过学习Objective-C的基本语法、类和...祝你在学习Objective-C的过程中取得成功!
读者在阅读《objective-c程序设计》后,可以掌握objective-c语言的基本内容,并进行实际的iphone/ipad和mac应用开发。《objective-c程序设计》共分成11章。前6章讲述objective-c语言,包括数据类型、运算符、表达式...
《Objective-C 程序设计(第4版)》已经为iOS 5和Xcode4.2中的重大变更做了全面更新,最大的改动是引入了自动引用计数(ARC),并详细说明了如何在Objective-C编程过程中使用ARC提升和简化内存管理。
使用objective-c语言实现的socket,有iphone平台下的,也有mac平台下的。对加深ios socket编程有一定帮助。
本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中的框架,以及继承、复合、源文件组织等众多重要的面向对象编程技术。...
C语言主要知识点巩固(学习Objective-C 的前提),PPT格式。
Objective-C - NSURLSession实现短信验证码注册登录完整示例:Objective-C - NSURLSession.m和附件说明
用 Objective-C 实现《大话设计模式》书中的例子,并用一些 Objective-C 的特性对例子的实现加以优化,希望能对初学设计模式的 iOS 开发者有所帮助。 前言 在某些人看来学习设计模式没有什么意义,因为在实际工作中...
用 Objective-C 实现《大话设计模式》书中的例子,并用一些 Objective-C 的特性对例子的实现加以优化.zip,用 Objective-C 实现《大话设计模式》书中的例子,并用一些 Objective-C 的特性对例子的实现加以优化
本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中的框架,以及继承、复合、源文件组织等众多重要的面向对象编程技术。...
Objective-C 是一种通用、面向对象的编程语言,广泛应用于 macOS 和 iOS 等苹果平台的开发中。它是 C 语言的超集,结合了 Smalltalk 式的消息传递机制和 C++ 的特性。Objective-C 是苹果公司采用的主要编程语言之一...
在windows系统下搭建Objective-C开发环境,由于公司要做iphone开发,个人学习objc(Objective-C)语法,所以在windows7下搭建了一个objc开发环境,现把自己整理的帮助文档拿来与大家分享,希望能对大家有所帮助。...
elcome to Learn Objective- C on the Mac! This book is designed to teach you the basics of the Objective- C language. Objective- C is a superset of C and is the language used by many (if not most) ...
Objective-C 分离 接口和实现文件,具体资料请参考苹果开发者Mike的博文http://blog.sina.com.cn/s/blog_7aa21f320100r7wn.html
本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中的框架,以及继承、复合、源文件组织等众多重要的面向对象编程技术。...