您的位置:首页 > 编程语言 > Go语言

Template Method(模板方法)

2014-04-25 17:14 148 查看
定义: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses.- Template Method lets subclasses redefine certain steps of an algorithm without letting them to change the algorithm's structure.

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

问题:写一个类SortArray,该类中有一个大小为10的int数组(为了简化问题。。。懒得用容器,实际中可能会是NSArray),同时对外提供一个sort方法,利用简单的插入排序对数字排序

#import <Foundation/Foundation.h>

@interface SortArray : NSObject

-(void) sort;

@end


#import "SortArray.h"

@implementation SortArray
{
int array[10];
}

-(void) sort
{
for (int i=0; i<10; i++)
for (int j=i+1; j<10; j++)
{
if (array[i]>array[j])
{
swap(array[i],array[j]);
}
}
}

@end

这是一个很简单的sort问题(感觉过去应该没有写错。。。),但是 现在有这么一个问题, 我在题目中并没有说怎么排序,按照从大到小或者是从小到大又或者是我自己定义的排序规则。。可以肯定的是 不管怎么排序  除了 array[i]>array[j]那个条件可能需要改变,其他都不用改变。于是 这里有一个解决办法是  把比较的那一行抽出来 利用函数指针让用户自己写一个比较函数 这是一种有效的解决方法。

但是。。。Template Method为我们提供了另外一种解决方法

让我们来看看Template Method是怎么做的

我们改写这个类,让其成为一个抽象类,同时提供一个抽象函数 

-(BOOL) comparedA:(int)a withB:(int)b;

将原来的sort函数变成这样

#import <Foundation/Foundation.h>

@interface SortArray : NSObject

-(void) sort;

-(BOOL) comparedA:(int)a withB:(int)b;//添加一个不实现的函数

@end


#import "SortArray.h"

@implementation SortArray
{
int array[10];
}

-(void) sort
{
for (int i=0; i<10; i++)
for (int j=i+1; j<10; j++)
{
if ([self comparedA:array[i] withB:array[j]])//修改这一行 把具体的比较算法换成一个函数,并且让这个函数在抽象类不实现,留给子类实现
{
swap(array[i],array[j]);
}
}
}

@end


然后 这时候有两个人找你 ,有一个人找你说 我需要一个从小到大排序的类。另外一个人又找你说 我需要一个从大到小排序的类 你就可以大胆的告诉他们 你们去新建一个AscendSortArray与DescendSortArray类 然后继承自SortArray,然后重写函数

-(BOOL) comparedA:(int)a withB:(int)b;
去定义它的比较规则即可,这样你们就可以想要的类了。因为你可以骄傲的告诉他们,我帮你们把排序的步骤都写好了,你们不需要修改我的代码,也不需要了解我内部排序的算法,只要约定你去重写那个比较函数即可,因为剩下的步骤我都帮你完成了

以AscendSortArray为例,调用者只需要这么做
#import <Foundation/Foundation.h>
#import "SortArray.h"

@interface AscendSortArray : SortArray

@end
#import "AscendSortArray.h"

@implementation AscendSortArray

-(BOOL) comparedA:(int)a withB:(int)b
{
if (a>b) return YES;
else return NO;
}

@end
这就是Template Mehod,我们重新看一次定义 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,我们在父类的Sort定义了所有的算法,除了一个比较函数被延迟到了子类中,因为我们并不知道调用者需要怎样的一个比较函数,于是 我们具体把这个函数留给调用者自己处理,剩下的事情 我们都帮他做好,他不必关心我们内部算法的实现是通过选择或者是快排之类实现的,只要定义好自己的compared方法也可以获得同样的效果 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息