模板方法模式的核心思想就是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。其实,模板方法模式就是提供了一个很好的代码复用平台。
首先,还是先简单看一下定义:
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
下面和给大家展示一下类的结构图:
其实,结构很简单,只有两层关系,核心思想就是把公共方法向上提到父类中。代码实现起来也不复杂。下面还是老样子,向大家简单展示一下代码如何实现。
首先是一个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
@interface YLSServiceDataInitScript : YLSInitialScriptTemplate @end
@implementation YLSServiceDataInitScript - (void) createEverythingForFirstTime { // 具体逻辑 } - (void) update { } - (NSString*) stepMsg { // 具体逻辑 } @end
[self doesNotRecognizeSelector:_cmd];
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]; }
模板方法(Template Method) Intent 定义算法框架,并将一些步骤的实现延迟到子类。 通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。 Class Diagram Implementation 冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。 // java public abstract class CaffeineBeve
介绍 模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找找我们,我们找你”,这指的是父类调用一个类的操作,而不是相反。具
本文向大家介绍详解C#设计模式编程中的模板方法模式使用,包括了详解C#设计模式编程中的模板方法模式使用的使用技巧和注意事项,需要的朋友参考一下 一、引言 提到模板,大家肯定不免想到生活中的“简历模板”、“论文模板”、“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载
本文向大家介绍JavaScript设计模式之模板方法模式原理与用法示例,包括了JavaScript设计模式之模板方法模式原理与用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript设计模式之模板方法模式原理与用法。分享给大家供大家参考,具体如下: 一、模板方法模式:一种只需使用继承就可以实现的非常简单的模式。 二、模板方法模式由两部分组成,第一部分是抽象父类,第二部分
本文向大家介绍Java设计模式模板方法模式(Template)用法解析,包括了Java设计模式模板方法模式(Template)用法解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java设计模式模板方法模式(Template)用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言: 我们在开发中有很多固定的流程,这些流程
本文向大家介绍学习JavaScript设计模式之模板方法模式,包括了学习JavaScript设计模式之模板方法模式的使用技巧和注意事项,需要的朋友参考一下 一、定义 模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 java中的抽象父类、子类 模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。 二、示例 Coffee or Tea (1) 把水煮沸 (2) 用沸水浸
本文向大家介绍设计模式中的模板方法模式在Ruby中的应用实例两则,包括了设计模式中的模板方法模式在Ruby中的应用实例两则的使用技巧和注意事项,需要的朋友参考一下 实例一 今天你还是像往常一样来上班,一如既往地开始了你的编程工作。 项目经理告诉你,今天想在服务器端增加一个新功能,希望写一个方法,能对Book对象进行处理,将Book对象的所有字段以XML格式进行包装,这样以后可以方便与客户端进行交互
本文向大家介绍iOS App设计模式开发中对迭代器模式的使用示例,包括了iOS App设计模式开发中对迭代器模式的使用示例的使用技巧和注意事项,需要的朋友参考一下 何为迭代器模式? 迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节。遍历集合中元素的职能从集合本身转移到迭代器对象。迭代器定义了一个用于访问集合元素并记录当前元素的接口。不同的迭代器可以执行不同的策略