Template Method 模式(李建忠老师)
Template Method设计模式主要运用的是虚函数的一些思想,因此我们可以通过这个模式对虚函数的有一个更深刻的认识,首先我们需要了解Template Method 模式它解决的是哪一类的问题:
定义一个操作中算法的骨架,而将一些步骤(虚函数)延迟到子类中去实现,Template Method模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
首先我们来提出一个问题:我们需要开发一个程序,程序库(Library)开发人员开发1、3、5三个步骤,应用程序(Application)开发人员开发2、4两个步骤,然后将五个步骤连接起来
首先来看一下在Template Method模式没有出现之前我们应该怎么去做,我们采用的是结构化流程,下面我贴出代码:
class Library
{
public void step1()
{
Console.WriteLine("Library.step1");
}
public void step3()
{
Console.WriteLine("Library.step3");
}
public void step5()
{
Console.WriteLine("Library.step5");
}
}
class Application
{
public bool step2()
{
Console.WriteLine("Application.step2");
return true;
}
public void step4()
{
Console.WriteLine("Application.step4");
}
}
class Program
{
public static void Main()
{
//虚拟流程的定义
Library lib = new Library();
Application app = new Application();
lib.step1();
if (app.step2())
{
lib.step3();
}
for (int i = 0; i < 3; i++)
{
app.step4();
}
lib.step5();
Console.ReadLine();
}
}
前面我们说过,要将五个步骤连接起来,这里我们在Program类中定义了一个虚拟的流程将,这是我们要特别注意,流程的定义是在Program中,按我的理解,这就是一种结构化的编程。
这种设计方式里面并没有涉及到虚函数,也没有涉及到面向对象的思想,下面我想用另一种方式来实现它,这时就出现了我们期待的Template Method模式,还是先看代码:
abstract class Library
{
public void Run() //虚拟流程的定义
{
this.step1();
if (this.step2())
{
this.step3();
}
for (int i = 0; i < 3; i++)
{
this.step4();
}
this.step5();
Console.ReadLine();
}
protected void step1()
{
Console.WriteLine("Library.step1");
}
protected void step3()
{
Console.WriteLine("Library.step3");
}
protected void step5()
{
Console.WriteLine("Library.step5");
}
protected abstract bool step2();
protected abstract void step4();
}
class Application:Library
{
protected override bool step2()
{
Console.WriteLine("Application.step2");
return true;
}
protected override void step4()
{
Console.WriteLine("Application.step4");
}
}
class Program
{
public static void Main()
{
Library app = new Application();
app.Run();
}
}
这两种方式运行所得的结果是一样的,但是这两种设计方式却完全不一样,第一种是结构化设计流程,第二种是面向对象的设计流程。对比一些这两段代码,我们发现最大的不同之处在于虚拟流程定义的位置发生了变化,在结构化时代,流程是由应用程序开发人员来控制完成的,在当前问题我们是将其定义在了Main函数中。到了面向对象的时代,流程是由程序库开发人员来控制完成的,也就是上面的Run函数。第一种方式是应用程序开发人员写的代码来调用程序库开发人员写的代码,这叫做早绑定,第二种是程序库开发人员写的代码来调用应用程序开发人员写的代码,这叫晚绑定。这就是一种设计的逆转,我们把第二种设计方式就叫做Template Method模式。
浙公网安备 33010602011771号