Template Method模板方法

一.TemplateMethod Pattern

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。子类可以不改变算法结构,重新定义该算法的某些特定步骤,算法结构可以理解为根据需求设计出来的业务流程,特定步骤即是那些可能在内容上存在变数的环节,算法结构可以理解为根据需求设计出来的业务流程,特定步骤即是那些可能在内容上存在变数的环节。

二.两个应用场景

1.日志文件输出器

在软件系统中,常常需要输出一些日志文件。对于不同的客户来说可能需要不同的界面展现,例如对于我们程序员来说,只需要打印出简单的TXT文件即可。而对于挑剔的客户来说,他们总是希望日志文件的展现也能非常友好,例如XML形式。可能在某些情况下,又需要其他方式的展现。

对于同一份数据,展现给不同的群体,需要不同的风格。可以用Template Method来实现。如图一。

(1)AbstractLogManager:抽象类,日志管理类

(2)TxtLogManager:实现类,TXT格式日志输出类。

(3)XmlLogManager:实现类,XML格式日志输出类。

(4)createFileName: 创建文件名,在父类为抽象方法。在TxtLogManager类中文件起名为“*.txt”。在XmlLogManager类中文件起名为:“*.xml”。当然视需求,命名方式还可以有别的差别。

(5)createFileContent: 创建文件内容,父类中为抽象方法。子类中视各个文件格式差异而不同,例如在xml中,总要加上各种标签:<text></text>,<bofy></body>等等。

(6)saveFile:保存文件。视需求存储到不同的磁盘路径下。

(7)writeLogFile:模板方法,调用createFileName(),createFileContent(),还有saveFile().

Template Method模板方法

图一:日志文件输出器类图


2.小应用程序

大公司都喜欢制定各种各样的行业标准,为的是快速开发出软件系统。例如现在的J2EE,.net,以及android开发等,厂商已经设计好顶层结构,我们只需写出一些实现类,即可完成很多应用。例如下面这个模式。

这是一个小应用程序框架,父类Applet作为抽象类,包含抽象方法init(),start(),stop(),destroy()。模板方法为run(),调用前面四个方法。至于run()函数中的逻辑,不是我们讨论的重点。而它里面的算法框架肯定是固定的。比如先初始化调用init(),在调用start(),中途停止掉stop(),退出则destroy().

而作为开发者,只需在子类中实现父类Applet中的三个抽象方法,即可产生新的小程序。如下图二所示。

Template Method模板方法

图二:小应用程序