模板方法模式是一种行为型设计模式,它定义了一个算法的步骤,将其中某些步骤的实现推迟到子类中。模板方法模式使得子类可以在不改变算法框架的情况下重新定义算法的某些步骤。
下面是一个使用C#语言实现模板方法模式的实例,假设我们要制作三明治,其中有三个步骤:添加面包、添加香肠和添加蔬菜,这三个步骤是按照特定的顺序进行的。
首先,我们定义一个抽象基类Sandwich,其中包含AddBread、AddSausage和AddVegetables三个抽象方法,还有一个MakeSandwich方法,它定义了三明治的制作流程。代码如下:
代码语言:javascript复制public abstract class Sandwich
{
public void MakeSandwich()
{
AddBread();
AddSausage();
AddVegetables();
}
protected abstract void AddBread();
protected abstract void AddSausage();
protected abstract void AddVegetables();
}
然后,我们定义三明治的具体类,比如火腿三明治、蔬菜三明治等等,这些类都是Sandwich类的子类,它们实现了AddBread、AddSausage和AddVegetables方法。代码如下:
代码语言:javascript复制public class HamSandwich : Sandwich
{
protected override void AddBread()
{
Console.WriteLine("加面包片");
}
protected override void AddSausage()
{
Console.WriteLine("加火腿");
}
protected override void AddVegetables()
{
Console.WriteLine("加黄瓜");
}
}
public class VegetableSandwich : Sandwich
{
protected override void AddBread()
{
Console.WriteLine("加面包片");
}
protected override void AddSausage()
{
Console.WriteLine("不加香肠");
}
protected override void AddVegetables()
{
Console.WriteLine("加蔬菜");
}
}
最后,我们可以使用这些类来制作三明治,代码如下:
代码语言:javascript复制var hamSandwich = new HamSandwich();
hamSandwich.MakeSandwich();
var vegetableSandwich = new VegetableSandwich();
vegetableSandwich.MakeSandwich();
输出结果为:
代码语言:javascript复制加面包片
加火腿
加黄瓜
加面包片
不加香肠
加蔬菜
这个例子中,Sandwich类定义了制作三明治的流程,其中包含了三个抽象方法,这些抽象方法需要在具体子类中实现。具体子类可以根据需要实现抽象方法,从而定制三明治的制作流程。这就是模板方法模式的核心思想。