The first glance of Template Method Pattern
上次看团队的技术讨论Blog,了解到了大家说Template Method Pattern是常用的设计模式之一,所以今天可花了点时间看了一下,起初一看,感觉没什么,太简单了,不就是继承吗?父类给个模板,子类相应的实现不就可以了吗?后来稍加注意了一下,感觉自己的理解只停留在Template上,却没有关注Method,实际上在父类中要有一个模板方法(template method),这个方法可能会封装了该类功能的算法或者计算逻辑的框架,而框架中包含的基本方法(primitive method)是要延迟到子类中去实现的。
在J2EE架构中Servlet中定义的Service方法实际上就是一个模板方法的体现,在Service方法中调用了一些基本的Do方法,比如我们熟悉的DoGet,DoPost,DoDelete等都是基本方法,这些Do方法由继承自Servlet的子类来实现,实际上也就是完成对Servlet的定制。
回顾一下自己编写的eHR的代码,感觉有好多地方有类似的功能,(下面牵扯到业务,大家可以略过)比如计算一批员工绩效考核的分等(相当于template method)就分为下面的一些方法(相当于primitive method):计算方案得分,计算关键事件得分,计算总得分,根据分等策略进行分等。这四个方法就相当于基本方法,由于这四个方法有的可能会有不同的实现,比如分等的时候可能采用基于比例的分等或者是基于分数的绝对分等,所以在不同的分等计算类(模板子类)中就可以实现这些不同的基本方法,但是计算逻辑是一样的:),说说我现在的处理方式,不怕大家笑话,我是把几中逻辑放在那里,把不用的逻辑注释掉,用的留下,惭愧啊!!!!
开始重构吧!
重构的初步思想用下面的代码体现,主要是不包含业务逻辑,以便理解:
* 模板方法模式
* 模板方法就是由一个父类来定义一种算法的结构,这个算法
* 的方法在父类中称为Template Method,同时在父类方法中定
* 义了实现该方法的框架,这些框架被称为是Primitive方法,
* 这些Primitive方法实现的具体细节被延迟到了子类中。
* 本段程序通过ePerformance中的计算分等包结果的例子来说
* 明该模式的应用。
* *****************************************************/
using System;
namespace TemplateMethod
{
/// <summary>
/// Client 的摘要说明。
/// </summary>
class Client
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
RateClassifyCalculater o_RateClassifyCalculater=new RateClassifyCalculater();
o_RateClassifyCalculater.MainCalculateLogic();
}
}
abstract class AbstractPackageCalculater
{
/// <summary>
/// 包分等计算的主逻辑框架
/// </summary>
public void MainCalculateLogic()
{
Console.WriteLine("Template Method Called");
ProjectCalculater();
PackageCalculater();
ClassifyPackage();
Console.ReadLine();
}
/// <summary>
/// 计算包中方案总得分的抽象方法
/// </summary>
abstract public void ProjectCalculater();
/// <summary>
/// 计算最终包的得分的抽象方法
/// </summary>
abstract public void PackageCalculater();
/// <summary>
/// 将计算好的包进行分等的抽象方法
/// </summary>
abstract public void ClassifyPackage();
}
class RateClassifyCalculater:AbstractPackageCalculater
{
/// <summary>
/// 比例分等计算的方案计算具体实现
/// </summary>
public override void ProjectCalculater()
{
Console.WriteLine("Rate classify's calculater of project score called");
}
/// <summary>
/// 比例分等计算的包分数计算具体实现
/// </summary>
public override void PackageCalculater()
{
Console.WriteLine("Rate classify's calculater of package score called");
}
/// <summary>
/// 比例分等计算的包分等策略具体实现
/// </summary>
public override void ClassifyPackage()
{
Console.WriteLine("Rate classify's calculater of package classify logic called");
}
}
}