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

    在上一篇 The first glance of Template Method Pattern中我提到了用模板方法模式来重构以前写过的代码,在看到 田春峰 的留言后,我重新审视了一下自己的代码,到底用策略模式呢,还是模板方法呢?她们之间有没有共性可以抽取出来?
    从策略模式的定义中可以看出, 策略模式是对一组相似算法的包装,使得算法的实现与算法使用环境相隔离,在父类中提供算法的统一接口以供环境对象Context调用,以最瘦小的策略模式实现来说实际上是不满足我的需求的,因为我的算法中还包含更多的子操作、子流程,而这些流程又很相象,她们的调用逻辑框架也是相象的,怎么办?把这些逻辑直接写在Common接口中?重构逻辑?将子逻辑独立出来给出统一定义并由子类实现?呵呵!越说越象Template Pattern了。
    那么我们就把 The first glance of Template Method Pattern中的代码重新构造一下:
   
/**/ /*******************************************************
 *                    策略模式
 *    策略模式是实现了对一组相似的算法的封装,使算法的实现
 * 与使用算法的环境相分离,在环境中可以定义使用哪种算法,
 * 个人认为策略模式与模板方法的结合可以实现更强的功能,本
 * 例子意图在于比较两个模式,无意说他们之间的好坏,旨在
 * 通过比较加深理解。
 * ****************************************************
*/

using  System;

namespace  StrategyPattern
{
    
/**//// 
    
/// Class1 的摘要说明。
    
/// 

    class StrategyPattern
    
{
        
/**//// 
        
/// 应用程序的主入口点。
        
/// 

        [STAThread]
        
static void Main(string[] args)
        
{
            Context o_Context
=new Context(new RateClassifyCalculater());
            o_Context.ContextIterface();
        }

    }


    
策略模式的抽象类,只不过中间加了个模板方法:)#region 策略模式的抽象类,只不过中间加了个模板方法:)
    
abstract public class  Strategy
    
{
        
/**//// 
        
/// 包分等计算的主逻辑框架
        
/// 

        public void MainCalculateLogic()
        
{
            Console.WriteLine(
"Template Method Called");
            ProjectCalculater();
            PackageCalculater();
            ClassifyPackage();
            Console.ReadLine();
        }


        
/**//// 
        
/// 计算包中方案总得分的抽象方法
        
/// 

        abstract public void ProjectCalculater();

        
/**//// 
        
/// 计算最终包的得分的抽象方法
        
/// 

        abstract public void PackageCalculater();

        
/**//// 
        
/// 将计算好的包进行分等的抽象方法
        
/// 

        abstract public void ClassifyPackage();

    }

    
#endregion


    
策略模式的实现类,当然也重写了模板方法中的Primitive方法#region 策略模式的实现类,当然也重写了模板方法中的Primitive方法
    
class RateClassifyCalculater:Strategy
    
{
        
/**//// 
        
/// 比例分等计算的方案计算具体实现
        
/// 

        public override void ProjectCalculater()
        
{
            Console.WriteLine(
"Rate classify's calculater of project score called");
        }


        
/**//// 
        
/// 比例分等计算的包分数计算具体实现
        
/// 

        public override void PackageCalculater()
        
{
            Console.WriteLine(
"Rate classify's calculater of package score called");
        }


        
/**//// 
        
/// 比例分等计算的包分等策略具体实现
        
/// 

        public override void ClassifyPackage()
        
{
            Console.WriteLine(
"Rate classify's calculater of package classify logic called");
        }




    }

    
#endregion


    
策略模式中所独有的环境类,与上篇文章中的代码相比,实际上仅此不同#region 策略模式中所独有的环境类,与上篇文章中的代码相比,实际上仅此不同
    
/**//// 
    
/// 策略模式中的环境类,用与掌控该使用哪种模式
    
/// 

    public class Context
    
{
        
private Strategy strategy;
        
public Context(Strategy initStratety)
        
{
            
this.strategy=initStratety;
        }

        
public void ContextIterface()
        
{
            Console.WriteLine(
"Strategy Context Interface called");
            strategy.MainCalculateLogic();
        }

    }

    
#endregion

}


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

转载于:https://www.cnblogs.com/Masterpiece/archive/2004/12/23/80858.html

你可能感兴趣的:(策略模式以及策略模式与模板方法的结合)