在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

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

Objective C 模板方法模式

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

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

Objective-C Singleton 单例模式解析,单例模式就是只有一个实例,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。   objective c ...
  • majiakun1
  • majiakun1
  • 2014年01月14日 23:19
  • 1096

OC实战: 抽象类的实现

这里, 假设你已经明白了 * oc 的继承. * oc 的多态.其实 oc 里面的方法都是虚方法. * oc 的协议 protocol. -------------------------------...
  • AndroidBluetooth
  • AndroidBluetooth
  • 2015年09月04日 17:01
  • 4934

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

《Objective-C编程全解》 读书笔记 第十一章 抽象类
  • qq_33033983
  • qq_33033983
  • 2017年03月18日 23:08
  • 365

Objective-C开发——从java转向Objective-C思想转变总结

之前一直学习的是java,javaweb,最近接触的是安卓的开发,假期看了一些关于Objective-C的内容 ,由于家里没有网络不能即时发布博文和大家分享了~        从之前学习的java语...
  • yangbo_hbzjk
  • yangbo_hbzjk
  • 2012年02月21日 16:17
  • 3863

(C++实现)——模板方法模式(Template Method Pattern)

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

【java设计模式】之 模板方法(Template Method)模式

1. 模板方法的一个实例         这一节主要来学习一下设计模式中的模板方法模式。我们先来看一个例子:假如现在老板让你做一个汽车的模型,要求只要完成基本功能即可,不考虑扩展性,那你会怎么做呢?...
  • eson_15
  • eson_15
  • 2016年05月06日 08:57
  • 4058

TemplateMethod模板方法模式之应用

一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。            二,类图:  ...
  • liujiahan629629
  • liujiahan629629
  • 2014年02月22日 19:37
  • 2358

模板方法模式(Template Method) - 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 - 模板方法模式。 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析...
  • carson_ho
  • carson_ho
  • 2017年02月07日 15:37
  • 5115

模板方法模式——Template Method Pattern

模板方法模式 模拟制作饮料的应用: 在冲泡饮料时,我们需要遵循下面的冲泡步骤,即 (1)把水煮沸 (2)用沸水冲泡 (3)把冲泡后的饮料倒进杯子 (4)加入适当的调料 另外,对于不同...
  • u010520912
  • u010520912
  • 2013年05月13日 18:08
  • 680
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在objective-c中实现模板方法模式(template method)
举报原因:
原因补充:

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