模板方法是最常见的设计模式之一,几乎可以在所有的抽象类中找到。
意图
定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构既可以重新定义该算法的某些特定步骤。这里需要复用的是算法的结构,即步骤,步骤地实现可以在子类中完成。
结构
模板方法很简单,也很常见,这里就不对其结构、使用场合和实现进行详细描述了。
采用委托方法实现模板方法
模板方法中的关键是在父类中的非抽象方法中调用抽象方法,子类之间的区别仅仅是实现方法的不同。在.NET中,我们可以使用委托技术来实现与模板方法相同的目的。
定义一个委托:
public delegate float Comp(float a, float b);
声明抽象的方法,在具体的方法中调用这个方法:
using System;
using System.Collections.Generic;
using System.Text;
namespace TemplateMethod.ex33_6
{
public class TemplateMethod
{
public delegate float Comp(float a, float b);
public Comp mycomp;
public float DoComp(float[] f)
{
float nf = float.NaN;
foreach (float df in f)
{
if (float.IsNaN(nf))
{
nf = df;
}
else
{
nf = mycomp(nf, df);
}
}
return nf;
}
}
}
using System.Collections.Generic;
using System.Text;
namespace TemplateMethod.ex33_6
{
public class TemplateMethod
{
public delegate float Comp(float a, float b);
public Comp mycomp;
public float DoComp(float[] f)
{
float nf = float.NaN;
foreach (float df in f)
{
if (float.IsNaN(nf))
{
nf = df;
}
else
{
nf = mycomp(nf, df);
}
}
return nf;
}
}
}
在另一个类中定义与委托相同的方法,这个类可以与TemplateMethod无关,只要其中方法的接口与代理相同即可:
using System;
using System.Collections.Generic;
using System.Text;
namespace TemplateMethod.ex33_6
{
public class DoComp
{
public float c1(float a, float b)
{
return a + b;
}
public float c2(float a, float b)
{
return a * b;
}
}
}
using System.Collections.Generic;
using System.Text;
namespace TemplateMethod.ex33_6
{
public class DoComp
{
public float c1(float a, float b)
{
return a + b;
}
public float c2(float a, float b)
{
return a * b;
}
}
}
使用这种方法可以实现模板方法相同的意图,并且更为灵活。在子类中实现不同方法的情况下,这种方法是一种更好的选择。但是如果在方法中涉及到对象的状态,这种方法则不适合。