定义一个(抽象)父类的虚方法中算法的大概骨架,再将详细算法步骤放到子类中重写(override)实现。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
UML
代码
//声明一个抽象父类
abstract class AbstractClass
{
//声明一个抽象方法
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
//声明一个继承父类的子类A
class ConcreteClassA : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("A类中方法1的实现");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("A类中方法2的实现");
}
}
//再声明一个继承父类的子类B
class ConcreteClassB : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("B类中方法1实现");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("B类中的方法2实现");
}
}
// test
AbstractClass c;
c = new ConcreteClassA();
c.TemplateMethod();
c = new ConcreteClassB();
c.TemplateMethod();
result
A类中方法1的实现
A方法2实现
B类中方法1的实现
B方法2实现
示例二: unity脚本
// 定义一个父类
public class BaseUIForm : MonoBehaviour
{
private void Awake()
{
//初始化基础信息
Initialization();
//初始化UI信息
InitUIInfo();
//初始化UI按钮点击事件
InitButtonClickEvent();
}
/// <summary>
/// 定义一个虚方法:初始化UI按钮点击事件
/// </summary>
protected virtual void InitButtonClickEvent()
{
// 父类的这个虚函数中还没有给出任何概览方法和步骤
}
}
// 子类继承父类
public class ArchUIForm : BaseUIForm
{
/// <summary>
/// 子类重写父类的虚方法,对父类中的概览步骤展开详细的算法处理:点击按钮后调用别处定义好的方法
/// </summary>
protected override void InitButtonClickEvent()
{
// 点击按钮后调用退出函数
RegisterButtonObjectEvent("BtnExit",
p =>
{
CloseUIForm();
}
);
}
}
模板方法模式的优缺点
模板方法优点:
通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。也就是说模板方法提供了一个很好的代码复用平台, 模板方法模式在抽象类中定义了算法实现的概览步骤,然后把具体的细节步骤放到子类中去实现,从而使所有子类复用了父类的代码,所以模板方法模式是基于继承的一种实现代码复用的技术。
优点:
- 实现了代码复用
- 能够灵活应对子步骤的变化,符合开放-封闭原则
缺点:
因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。
引用:
https://blog.csdn.net/u010921682/article/details/82589789
https://blog.csdn.net/xuanyin235/article/details/88812487