策略模式以及策略模式与模板方法的结合
在上一篇The first glance of Template Method Pattern中我提到了用模板方法模式来重构以前写过的代码,在看到 田春峰 的留言后,我重新审视了一下自己的代码,到底用策略模式呢,还是模板方法呢?她们之间有没有共性可以抽取出来?
从策略模式的定义中可以看出,策略模式是对一组相似算法的包装,使得算法的实现与算法使用环境相隔离,在父类中提供算法的统一接口以供环境对象Context调用,以最瘦小的策略模式实现来说实际上是不满足我的需求的,因为我的算法中还包含更多的子操作、子流程,而这些流程又很相象,她们的调用逻辑框架也是相象的,怎么办?把这些逻辑直接写在Common接口中?重构逻辑?将子逻辑独立出来给出统一定义并由子类实现?呵呵!越说越象Template Pattern了。
那么我们就把The first glance of Template Method Pattern中的代码重新构造一下:
从策略模式的定义中可以看出,策略模式是对一组相似算法的包装,使得算法的实现与算法使用环境相隔离,在父类中提供算法的统一接口以供环境对象Context调用,以最瘦小的策略模式实现来说实际上是不满足我的需求的,因为我的算法中还包含更多的子操作、子流程,而这些流程又很相象,她们的调用逻辑框架也是相象的,怎么办?把这些逻辑直接写在Common接口中?重构逻辑?将子逻辑独立出来给出统一定义并由子类实现?呵呵!越说越象Template Pattern了。
那么我们就把The first glance of Template Method Pattern中的代码重新构造一下:
/*******************************************************
* 策略模式
* 策略模式是实现了对一组相似的算法的封装,使算法的实现
* 与使用算法的环境相分离,在环境中可以定义使用哪种算法,
* 个人认为策略模式与模板方法的结合可以实现更强的功能,本
* 例子意图在于比较两个模式,无意说他们之间的好坏,旨在
* 通过比较加深理解。
* *****************************************************/
using System;
namespace StrategyPattern
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class StrategyPattern
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Context o_Context=new Context(new RateClassifyCalculater());
o_Context.ContextIterface();
}
}
策略模式的抽象类,只不过中间加了个模板方法:)
策略模式的实现类,当然也重写了模板方法中的Primitive方法
策略模式中所独有的环境类,与上篇文章中的代码相比,实际上仅此不同
}
* 策略模式
* 策略模式是实现了对一组相似的算法的封装,使算法的实现
* 与使用算法的环境相分离,在环境中可以定义使用哪种算法,
* 个人认为策略模式与模板方法的结合可以实现更强的功能,本
* 例子意图在于比较两个模式,无意说他们之间的好坏,旨在
* 通过比较加深理解。
* *****************************************************/
using System;
namespace StrategyPattern
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class StrategyPattern
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Context o_Context=new Context(new RateClassifyCalculater());
o_Context.ContextIterface();
}
}
策略模式的抽象类,只不过中间加了个模板方法:)
策略模式的实现类,当然也重写了模板方法中的Primitive方法
策略模式中所独有的环境类,与上篇文章中的代码相比,实际上仅此不同
}
实际上从代码中可以看出,从整体结构上讲应该算是策略模式的应用,实现了策略实现与环境的分离,由环境决定采用什么策略(当然这也是策略模式的一个缺点,环境必须知道所有的策略,并知道应该用什么策略),但从策略的统一接口来说又可以说是一个模板方法,不知道把这个运用说成是策略模式和模板方法的结合是否牵强?
其实归根结底,在这两种模式的运用中最原始的东西是什么?正如 idior在他的再谈多态 中所讲的一样,是多态的运用。