TemplateMethod Pattern(模板方法模式)
模式简介
模板方法模式是一种行为型设计模式。父类规定业务逻辑的框架,将框架中的步骤抽象为模板方法,将具体的步骤交给子类实现或重写,每个步骤的调用由父类决定。对于业务逻辑的架构相似而具体实现不同的需求则可以考虑采用模板方法模式。
常见的应用场景:框架设计、算法实现、文档生成、游戏开发和生命周期管理等。
模式结构
-
抽象类(Abstract Class): 定义了算法的骨架,包括一个模板方法和若干个抽象方法。抽象方法由子类实现,而模板方法在抽象类中定义了算法的结构,包括一系列步骤。
-
具体类(Concrete Class): 实现了抽象类中定义的抽象方法,完成算法中具体的细节。每个具体类可以提供不同的实现,以满足特定的需求。
工作原理
-
模板方法定义算法骨架: 抽象类中的模板方法定义了算法的结构,包括一系列步骤。这些步骤可以包括具体的方法和抽象方法。
-
抽象方法由子类实现: 抽象类中的抽象方法由具体的子类实现,这样不同的子类可以提供不同的实现细节。
-
模板方法负责调用步骤: 模板方法按照算法的结构调用定义的各个步骤,包括具体方法和抽象方法。这确保了算法的基本流程在不同的子类中保持一致。
-
子类定制具体步骤: 具体的子类通过实现抽象方法来定制算法的具体步骤,以满足特定的需求。子类可以选择性地覆盖某些步骤,而保留其他步骤不变。
代码示例(C#)
提示:可在本栏目的资源篇“设计模式代码示例合集”下载所有完整代码资源。
饮品模板:BeverageTemplate.cs
namespace TemplateMethodPattern;
// 制作饮品的模板
abstract class BeverageTemplate
{
protected string name; // 饮品名称
public BeverageTemplate()
{
name = "饮品";
}
// 制作饮品
public void MakeBeverage()
{
BoilWater();
Prepare();
AddCondiments();
PutIntoCup();
Console.WriteLine($"{name}制作完成了!");
Console.WriteLine(new string('-', 20));
}
// 烧水
protected void BoilWater()
{
Console.WriteLine("正在烧水...");
}
// 装杯
protected void PutIntoCup()
{
Console.WriteLine($"{name}正在装入杯中...");
}
// 冲调
protected abstract void Prepare();
// 加入调味品
protected abstract void AddCondiments();
}
饮品:Beverage.cs
namespace TemplateMethodPattern;
// 果汁
class Juice : BeverageTemplate
{
public Juice()
{
name = "果汁";
}
protected override void Prepare()
{
Console.WriteLine($"{name}正在冲调...");
}
protected override void AddCondiments()
{
Console.WriteLine($"{name}正在加入调味品...");
}
}
// 茶
class Tea : BeverageTemplate
{
public Tea()
{
name = "茶";
}
protected override void Prepare()
{
Console.WriteLine($"{name}正在冲调...");
}
protected override void AddCondiments()
{
Console.WriteLine($"{name}正在加入调味品...");
}
}
测试代码:Program.cs
// ************* 22.模板方法模式测试 **************
using TemplateMethodPattern;
// 创建实例
Juice juice = new Juice();
Tea tea = new Tea();
// 制作果汁
juice.MakeBeverage();
// 制作茶
tea.MakeBeverage();
代码解说
上述代码模拟了制作果汁和茶的过程。饮品模板定义了制作饮品的四个步骤,烧水、冲调、加调味品和装杯,通常烧水和装杯步骤不会因为饮品不同而有所改变,但是冲调和加调味品步骤可能会各有不同。由于制作饮品的步骤顺序一致,所以饮品模板仅向外提供一个制作饮品的方法作为接口,从而简化调用。
如果这篇文章对你有帮助,请给作者点个赞吧!
浙公网安备 33010602011771号