设计模式(八)——模板方法模式
这几天杂七杂八的事有点多,停了几日,今日继续,今天讲最简单的模板方法,但是却是用的比较广泛的。首先来明确下概念吧,模板方法的写法是这样,准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来。
具体来看代码吧,大家比较熟悉的单元测试junit的源码在设计上就应用了模板方法模式,下面我来模拟一下,记住,只是模拟一个大概的流程,表达一个思路,实际上真正的junit的源码要复杂一点。
首先我们知道,单元测试一般有三个流程,即数据初始化阶段,实际测试阶段,数据回收阶段,我们设计时会把这些方法都写成抽象的,因为我们并不知道你要测什么,你需要什么资源,得由具体测试的人去实现这些方法。
package com.gy.designpattern.template;
/**
* ClassName:MyTestCase <br/>
* Function: 自定义一个测试的模板. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2012-7-17 下午4:14:20 <br/>
* @author gongyong
* @version
* @since JDK 1.6
* @see
*/
public abstract class MyTestCase {
//定义抽象操作,以便让子类实现
protected void setUp() throws Exception {
}
protected void runTest() throws Throwable {
}
protected void tearDown() throws Exception {
}
//具体的模板方法,定义出逻辑骨架
public void runBare() throws Throwable {
setUp();
runTest();
tearDown();
}
}
下面,我们假如要测试一个获取消息的方法,那我们会这么写这个测试
package com.gy.designpattern.template;
/**
* ClassName:MessageTest <br/>
* Function: 抽象模板的继承,这里实现具体的基本方法. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2012-7-17 下午4:16:36 <br/>
* @author gongyong
* @version
* @since JDK 1.6
* @see
*/
public class MessageTest extends MyTestCase{
/**
* 第一步,初始化.
* @see com.gy.designpattern.template.MyTestCase#setUp()
*/
public void setUp() throws Exception {
System.out.println("测试前的数据初始化工作");
}
/**
* 第二步,具体的测试.
* @see com.gy.designpattern.template.MyTestCase#runTest()
*/
protected void runTest() throws Throwable {
System.out.println("这里对被测方法进行测试。。。");
}
/**
*第三步,测试完毕,资源回收.
* @see com.gy.designpattern.template.MyTestCase#tearDown()
*/
public void tearDown() throws Exception {
System.out.println("测试完或对资源的释放操作");
}
}
具体的测试我就不写了,我就用一句话代替了,这个应该懂的。到这里其实就已经写完了。当然,你还可以写其他任何的测试,只不过是都继承自这个抽象类,然后具体实现这三个方法而已。这就是模板方法的用处。最后我们运行这个单元测试,模拟个运行器:
package com.gy.designpattern.template;
/**
* ClassName:Client <br/>
* Function: 模拟一个单元测试的运行器. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2012-7-17 下午4:25:37 <br/>
* @author gongyong
* @version
* @since JDK 1.6
* @see
*/
public class Client {
public static void main(String[] args) throws Throwable{
MessageTest messageTest=new MessageTest();
messageTest.runBare();
}
}
实际上,我们看junit的源码,它不是这么直接的,但是他就是按照这个思路设计的,它只不过还拐了几个弯而已,比如我们在继承类里实现了一个 protected void runTest()方法,实际上我们在写的时候就不是这么写的,名字我们可以随便起(3.X以前的名字必须带test),然后junit用适配器模式将这个方法配成了 runTest方法,其实还是一样。
好吧,就说到这里。
分享到:
相关推荐
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...
设计模式——模板方法模式模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤使用场景:当不变和可...
本文实例讲述了Python设计模式之模板方法模式。分享给大家供大家参考,具体如下: ...设计模式——模板方法模式 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子
设计模式对你来说,应该不陌生。在面试中,经常会被问到;在工作...
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...
走进设计模式之—— Template(模板模式)
在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来理解模板方法的定义。 二、模板方法模式详细介绍 2.1 模板方法模式的定义 模板...
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式
4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...
4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...
5.10 TEMPLATE METHOD(模板方法)——类行为型模式 5.11 VISITOR(访问者)——对象行为型模式 5.12 行为模式的讨论 第六章 结论 6.1 设计模式将带来什么 6.2 一套通用的设计词汇 6.3 书写文档和学习的辅助手段 ...
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
事实上,许多程序问题都不断的反复的遇到,而且许多用来解决这些问题的基本方法(或者说是设计模式)都已经浮现出来。设计模式就是一个教你如何利用真实可靠的设计来组织你的代码的模板。 设计模式历史 ...
针对23种设计模式,分别写了demo并画了类图帮助理解。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰...
工厂方法模式: 而是将具体创建的工作交给子类去做, 工厂方法模式 核心工厂类不再负责所有产品的创建, 成为一个抽象工厂角色, 仅负责给出具体工厂类必须实现的接口, 而不接触哪一个产品类应 当被实例化这种细节...
第一部分 设计模式初体验第1章 你好,设计模式1.1 这是一本什么书1.2 开始前的准备1.3 预备知识1.4 似曾相识的设计1.5 设计模式的起源——模型、视图和控制器1.5.1 在模型对象中封装数据和基本行为1.5.2 使用视图...
同一个模式模式vs策略 || || 抽象 实现分层思路J2EE模式表现层模式业务层模式集成层模式J2EE模式目录指南术语UML的使用 类图——静态视图 序列图——动态视图 构造型(stereotypes)——表现在类图和交互图中...
在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都...为了提高代码的复用性和系统的灵活性,可以使用一种称之为模板方法模式的设计模式来对这类情况进行设计,在模板方法模式中,将实现功能
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...