策略模式以及策略模式与模板方法的结合

    在上一篇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方法

    
策略模式中所独有的环境类,与上篇文章中的代码相比,实际上仅此不同
}


实际上从代码中可以看出,从整体结构上讲应该算是策略模式的应用,实现了策略实现与环境的分离,由环境决定采用什么策略(当然这也是策略模式的一个缺点,环境必须知道所有的策略,并知道应该用什么策略),但从策略的统一接口来说又可以说是一个模板方法,不知道把这个运用说成是策略模式和模板方法的结合是否牵强
    其实归根结底,在这两种模式的运用中最原始的东西是什么?正如 idior在他的再谈多态 中所讲的一样,是多态的运用

posted on 2004-12-23 09:50  纯爷们  阅读(3334)  评论(1编辑  收藏  举报

导航