定义: 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;
#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
-(BOOL) comparedA:(int)a withB:(int)b;
#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方法也可以获得同样的效果