目录
1.前言
现代软件专业分工后的第一个结果是“框架与应用程序的划分”、“组件协作”模式通过晚期绑定,来实现框架与程序之间的松耦合,是二者之间协作时常用的模式。
典型模式:
- Template Method
- Strategy
- Observer/Event
2.模板方法模式(Template Method)
1.动机
- 软件构建过程中,它常常有稳定的整体结构,但各个子步骤却有很多改变的需求或者由于固定的原因而无法和任务的整体结构同时实现。
- 如何确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求
2.例子
//早绑定
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pattern
{
//程序开发人员
class Library
{
public void Step1()
{
//...
}
public void step3()
{
//...
}
public void step5()
{
//...
}
}
//应用程序开发人员
class Program
{
public bool Step2()
{
bool flag = false;
return flag;
}
public void Step4()
{
//...
}
static void Main(string[] args)
{
Library lib = new Library();
Program app = new Program();
lib.Step1();
if (app.Step2())
{
lib.step3();
}
for (int i = 0; i < 4; i++)
{
app.Step4();
}
lib.step5();
}
}
}
程序主流程在软件中相对稳定,具有复用性
//晚绑定
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pattern
{
//程序开发人员
public class Library
{
//稳定 Template Method
public void Run()
{
Step1();
if (Step2())
{
step3();//支持变化==》虚函数的多态调用
}
for (int i = 0; i < 4; i++)
{
Step4();//支持变化==》虚函数的多态调用
}
step5();
}
protected void Step1()
{
//...
}
protected void step3()
{
//...
}
protected void step5()
{
//...
}
public virtual bool Step2()
{
//变化
return false;
}
public virtual void Step4()//变化
{
}
}
//应用程序开发人员
class Program : Library
{
public override bool Step2()
{
bool flag = false;
return flag;
}
public override void Step4()
{
//...
}
static void Main(string[] args)
{
Library lib = new Program();
lib.Run();
}
}
}
3.定义
一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Tempalte Method使得子类可以不改变(复用)一个结构即可重定义(override重写)该算法的某些特定步骤。——GOF
1.结构图
模板方法模式参与者
(1)、抽象类角色(AbstractClass):定义一个模板方法(TemplateMethod),在该方法中包含着一个算法的骨架,具体的算法步骤是PrimitiveOperation1方法和PrimitiveOperation2方法,该抽象类的子类将重定义PrimitiveOperation1和PrimitiveOperation2操作。
(2)、具体类角色(ConcreteClass):实现PrimitiveOperation1方法和PrimitiveOperation2方法以完成算法中与特定子类(Client)相关的内容。
在模板方法模式中,AbstractClass中的TemplateMethod提供了一个标准模板,该模板包含PrimitiveOperation1和PrimitiveOperation2两个方法,这两个方法的内容Client可以根据自己的需要重写。
2.模板方法模式适用情形
(1)、 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
(2)、 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
(3)、 控制子类扩展。模板方法只允许在特定点进行扩展,而模板部分则是稳定的。
3.模式特点
- 该模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。机制简洁(虚函数的多态性),为很多应用程序框架提供了灵活的扩展点,时代吗复用方面的基本实现结构 。
- “不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用
- 被Template Method调用的虚方法可以实现,也可以没有实现(抽象方法、纯虚方法),但一般它们设置为protected方法。
参考
C#设计模式之十三模板方法模式(Template Method Pattern)
哔哩哔哩:李建忠设计模型