`
gong1208
  • 浏览: 557052 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式(八)——模板方法模式

阅读更多

设计模式(八)——模板方法模式


这几天杂七杂八的事有点多,停了几日,今日继续,今天讲最简单的模板方法,但是却是用的比较广泛的。首先来明确下概念吧,模板方法的写法是这样,准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(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方法,其实还是一样。

好吧,就说到这里。

 

分享到:
评论
4 楼 gong1208 2012-07-19  
hamber 写道
模板方法的父类实现部分逻辑,有固定的流程
门面完全是一类的接口API?

hamber 写道
gong1208 写道
这里我回答有位叫hamber的网友在我上篇“门面模式”中提到问题,他问门面模式和模板模式的区别。其实看上去好像挺像的,就是把首先实现了一个抽象类或是接口中的方法,然后把这些方法组合排列进一个方法里,进行调用,对吧。但是实际上是这样,首先,用的目的不一样,门面模式,我们是用于将一个复杂的子系统进行封装,然后对外提供一个统一的调用接口,我们的目的是用户不想过多的去了解这个子系统是怎么实现的,我就想调用你,你给我个简单易用的接口就完事,甚至,这个子系统就是不是同一个人写的,调用这个子系统的人也不想知道你怎么写的,他就想知道怎么用就完事。那模板模式呢,如果我要用你这个模板,我得知道你的具体构造,我都实现你规定的这些方法,按你的模式来走,然后我再调用这个我自己实现的模板。看吧,区别一目了然。还有一点,门面模式中,我的门面的灵活度更高,我不受你的子系统的限制,我甚至可以把多个子系统组成一个新的接口,供客户端调用。但是模板模式不行,我就得按照你的模板规规矩矩来实现,然后供客户端调用。不知道我这样说你能否理解。若有不对,还望指教。


看起来就是一个是抽象类做父类?一个是接口作为门面?
设计模式这东西真不能钻牛角尖.


呵呵,我并没有说门面模式就是一个抽象类作为父类一个接口作为门面,注意我用的是“看起来”,而这么说的目的在于解释你为什么认为门面模式和模板方法模式很像,因为你问我这个两个模式有什么不同,那就是说你认为这个两个模式看上去很像,而实际是我认为这两个模式完全没有可比性,所以我说“看上去。。。”,如果我揣摩错了你问那个问题的用意还请指正。或者你可以阐述一下你的看法,那就不甚感激了
3 楼 hamber 2012-07-18  
模板方法的父类实现部分逻辑,有固定的流程
门面完全是一类的接口API?
2 楼 hamber 2012-07-18  
gong1208 写道
这里我回答有位叫hamber的网友在我上篇“门面模式”中提到问题,他问门面模式和模板模式的区别。其实看上去好像挺像的,就是把首先实现了一个抽象类或是接口中的方法,然后把这些方法组合排列进一个方法里,进行调用,对吧。但是实际上是这样,首先,用的目的不一样,门面模式,我们是用于将一个复杂的子系统进行封装,然后对外提供一个统一的调用接口,我们的目的是用户不想过多的去了解这个子系统是怎么实现的,我就想调用你,你给我个简单易用的接口就完事,甚至,这个子系统就是不是同一个人写的,调用这个子系统的人也不想知道你怎么写的,他就想知道怎么用就完事。那模板模式呢,如果我要用你这个模板,我得知道你的具体构造,我都实现你规定的这些方法,按你的模式来走,然后我再调用这个我自己实现的模板。看吧,区别一目了然。还有一点,门面模式中,我的门面的灵活度更高,我不受你的子系统的限制,我甚至可以把多个子系统组成一个新的接口,供客户端调用。但是模板模式不行,我就得按照你的模板规规矩矩来实现,然后供客户端调用。不知道我这样说你能否理解。若有不对,还望指教。


看起来就是一个是抽象类做父类?一个是接口作为门面?
设计模式这东西真不能钻牛角尖.
1 楼 gong1208 2012-07-17  
这里我回答有位叫hamber的网友在我上篇“门面模式”中提到问题,他问门面模式和模板模式的区别。其实看上去好像挺像的,就是把首先实现了一个抽象类或是接口中的方法,然后把这些方法组合排列进一个方法里,进行调用,对吧。但是实际上是这样,首先,用的目的不一样,门面模式,我们是用于将一个复杂的子系统进行封装,然后对外提供一个统一的调用接口,我们的目的是用户不想过多的去了解这个子系统是怎么实现的,我就想调用你,你给我个简单易用的接口就完事,甚至,这个子系统就是不是同一个人写的,调用这个子系统的人也不想知道你怎么写的,他就想知道怎么用就完事。那模板模式呢,如果我要用你这个模板,我得知道你的具体构造,我都实现你规定的这些方法,按你的模式来走,然后我再调用这个我自己实现的模板。看吧,区别一目了然。还有一点,门面模式中,我的门面的灵活度更高,我不受你的子系统的限制,我甚至可以把多个子系统组成一个新的接口,供客户端调用。但是模板模式不行,我就得按照你的模板规规矩矩来实现,然后供客户端调用。不知道我这样说你能否理解。若有不对,还望指教。

相关推荐

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    python 模板方法模式(示例)

    设计模式——模板方法模式模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤使用场景:当不变和可...

    Python设计模式之模板方法模式实例详解

    本文实例讲述了Python设计模式之模板方法模式。分享给大家供大家参考,具体如下: ...设计模式——模板方法模式 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子

    设计模式之美——教你写出高质量代码

    设计模式对你来说,应该不陌生。在面试中,经常会被问到;在工作...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    Java设计模式 版本2

    对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...

    Template(模板模式)

    走进设计模式之—— Template(模板模式)

    详解C#设计模式编程中的模板方法模式使用

    在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来理解模板方法的定义。 二、模板方法模式详细介绍 2.1 模板方法模式的定义 模板...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第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 书写文档和学习的辅助手段 ...

    24种设计模式介绍与6大设计原则

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    PHP设计模式(chm版)

    事实上,许多程序问题都不断的反复的遇到,而且许多用来解决这些问题的基本方法(或者说是设计模式)都已经浮现出来。设计模式就是一个教你如何利用真实可靠的设计来组织你的代码的模板。 设计模式历史 ...

    设计模式Demo

    针对23种设计模式,分别写了demo并画了类图帮助理解。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰...

    C#23种设计模式_示例源代码及PDF

    工厂方法模式: 而是将具体创建的工作交给子类去做, 工厂方法模式 核心工厂类不再负责所有产品的创建, 成为一个抽象工厂角色, 仅负责给出具体工厂类必须实现的接口, 而不接触哪一个产品类应 当被实例化这种细节...

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    第一部分 设计模式初体验第1章 你好,设计模式1.1 这是一本什么书1.2 开始前的准备1.3 预备知识1.4 似曾相识的设计1.5 设计模式的起源——模型、视图和控制器1.5.1 在模型对象中封装数据和基本行为1.5.2 使用视图...

    【J2EE核心模式】——J2EE模式概览

    同一个模式模式vs策略 || || 抽象 实现分层思路J2EE模式表现层模式业务层模式集成层模式J2EE模式目录指南术语UML的使用 类图——静态视图 序列图——动态视图 构造型(stereotypes)——表现在类图和交互图中...

    模板方法模式深度解析

    在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都...为了提高代码的复用性和系统的灵活性,可以使用一种称之为模板方法模式的设计模式来对这类情况进行设计,在模板方法模式中,将实现功能

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

Global site tag (gtag.js) - Google Analytics