`
zzq19860626
  • 浏览: 261127 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
B20df9e2-fb3d-3644-9f72-c1619842f682
设计模式学习笔记
浏览量:178034
87eaf24f-812a-3463-8e65-e3197d2ad8c2
java虚拟机
浏览量:26210
社区版块
存档分类
最新评论

JAVA设计模式学习18——模版方法模式

阅读更多
模版方法(Template Method)模式:属于类的行为模式,它的用意是定义一个操作中的算法的骨架,将一些操作延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模版方法模式的类图如下:
模版方法模式有两个角色:
1、抽象模版(Abstract Template)角色:定义了一个或多个抽象操作,同时定义了一个模版方法,它是一个具体的方法,作为抽象模版的骨架。实际的逻辑在抽象操作中,推迟到子类实现。
2、实现模版(Concrete Template)角色:实现了抽象模版中一个或多个抽象方法。
 
这里举个模拟计算器的例子来说模版方法模式,我们知道计算器计算的时候首先获取操作数1,然后获取操作数2,再进行加减乘除运算,最后显示在屏幕上,对于计算器来说不管是计算加减乘除那一种,都是要获取两个操作数,计算后再显示。可以建立以下类图模型:

 
 举例代码如下:
package templateMethod;
/**
 * 
 *作者:alaric
 *时间:2013-8-9下午8:15:18
 *描述:抽象模版角色
 */
public abstract class AbstractClass {

	/**
	 * 
	 *作者:alaric
	 *时间:2013-8-9下午8:17:00
	 *描述:模版方法
	 */
	public final void templateMethod(){
		int m = getNum1();
		int n = getNum2();
		int s = operate(m ,n);
		show(s);
	}

	/**
	 * 
	 *作者:alaric
	 *时间:2013-8-9下午8:21:49
	 *描述:获取第一个操作数
	 */
	private int getNum1(){
		return 8;
	}
	/**
	 * 
	 *作者:alaric
	 *时间:2013-8-9下午8:21:49
	 *描述:获取第二个操作数
	 */
	private int getNum2(){
		return 2;
	}
	/**
	 * 
	 *作者:alaric
	 *时间:2013-8-9下午8:19:53
	 *描述:算法
	 */
	public abstract int operate(int m,int n);
	/**
	 * 
	 *作者:alaric
	 *时间:2013-8-9下午8:20:59
	 *描述:显示
	 */
	public void show(int s){
		System.out.println("结果是:"+ s);
	}
	
}
 
package templateMethod;
/**
 * 
 *作者:alaric
 *时间:2013-8-9下午8:57:06
 *描述:加法
 */
public class AddClass extends AbstractClass{

	@Override
	public int operate(int m,int n) {
		return m+n;
	}

}
 
package templateMethod;
/**
 * 
 *作者:alaric
 *时间:2013-8-9下午8:57:24
 *描述:减法
 */
public class SubClass extends AbstractClass{

	@Override
	public int operate(int m,int n) {
		return m-n;
	}

}
 
package templateMethod;
/**
 * 
 *作者:alaric
 *时间:2013-8-9下午8:57:38
 *描述:乘法
 */
public class MultiClass extends AbstractClass{

	@Override
	public int operate(int m,int n) {
		return m*n;
	}

}
 
package templateMethod;
/**
 * 
 *作者:alaric
 *时间:2013-8-9下午8:57:50
 *描述:除法
 */
public class DivClass extends AbstractClass{

	@Override
	public int operate(int m,int n) {
		return m/n;
	}

}
 
package templateMethod;
/**
 * 
 *作者:alaric
 *时间:2013-8-9下午8:14:34
 *描述:测试类
 */
public class Client {

	/**
	 *作者:alaric
	 *时间:2013-8-9下午8:14:28
	 *描述:
	 */
	public static void main(String[] args) {
		//加
		AbstractClass c1 = new AddClass();
		c1.templateMethod();
		//减
		AbstractClass c4 = new SubClass();
		c4.templateMethod();
		//乘
		AbstractClass c2 = new MultiClass();
		c2.templateMethod();
		//除
		AbstractClass c3 = new DivClass();
		c3.templateMethod();
		

	}

}
 运行结果:
结果是:10
结果是:6
结果是:16
结果是:4
整个计算过程(取操作数,计算,显示)使用了模版方法模式,模版方法规定程序实现步骤,并且在子类中无法改变,而子类必须实现abstract修饰的抽象方法,不同的实现类可以有不同的实现,这也是模版方法模式的用意。如果你了解策略模式,你会发现在每条算法的封装上很像策略模式,而又不是策略模式,策略模式是利用委派的方法提供不同的算法行为,而模版方法是利用继承来提供不同的算法行为的。
 

设计模式系列目录:

  • 大小: 9.6 KB
  • 大小: 12.4 KB
5
2
分享到:
评论
9 楼 zzq19860626 2013-08-18  
yingjianxuehun 写道
zzq19860626 写道
yingjianxuehun 写道
讲的不错,不过还有些不足,模板方法的定义是定义一个操作中的算法的骨架,将一些操作延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。而现在好多人只关注了前半句,往往忽略了后半句,即定义一个算法的骨架实现了,但是“使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤”忽略了,其实后半句也很简单就是 hook(钩子函数)。

说的对,其实在看GoF设计模式的时候对抽象模板中的方法定义是有区分的,其中一个就是hook(钩子函数),其实也就是有一个默认的实现方法,子类可以重新实现。我写的例子里show()方法就是以子类可改变的。也算一个hook


嗯,是的,lz继续努力支持,,,
只是现在大部分学模板方法的往往忽略了后半句,所以提醒下,没啥别的意思。。。学习、 交流、进步

谢谢支持啊,其实我是抛砖引玉了,希望更多的人来拍砖,相互讨论交流才能让学习的内容更真实。
8 楼 yingjianxuehun 2013-08-18  
zzq19860626 写道
yingjianxuehun 写道
讲的不错,不过还有些不足,模板方法的定义是定义一个操作中的算法的骨架,将一些操作延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。而现在好多人只关注了前半句,往往忽略了后半句,即定义一个算法的骨架实现了,但是“使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤”忽略了,其实后半句也很简单就是 hook(钩子函数)。

说的对,其实在看GoF设计模式的时候对抽象模板中的方法定义是有区分的,其中一个就是hook(钩子函数),其实也就是有一个默认的实现方法,子类可以重新实现。我写的例子里show()方法就是以子类可改变的。也算一个hook


嗯,是的,lz继续努力支持,,,
只是现在大部分学模板方法的往往忽略了后半句,所以提醒下,没啥别的意思。。。学习、 交流、进步
7 楼 zzq19860626 2013-08-14  
yingjianxuehun 写道
讲的不错,不过还有些不足,模板方法的定义是定义一个操作中的算法的骨架,将一些操作延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。而现在好多人只关注了前半句,往往忽略了后半句,即定义一个算法的骨架实现了,但是“使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤”忽略了,其实后半句也很简单就是 hook(钩子函数)。

说的对,其实在看GoF设计模式的时候对抽象模板中的方法定义是有区分的,其中一个就是hook(钩子函数),其实也就是有一个默认的实现方法,子类可以重新实现。我写的例子里show()方法就是以子类可改变的。也算一个hook
6 楼 yingjianxuehun 2013-08-14  
讲的不错,不过还有些不足,模板方法的定义是定义一个操作中的算法的骨架,将一些操作延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。而现在好多人只关注了前半句,往往忽略了后半句,即定义一个算法的骨架实现了,但是“使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤”忽略了,其实后半句也很简单就是 hook(钩子函数)。
5 楼 zzq19860626 2013-08-13  
mnieguomin 写道
讲得蛮不错的,支持下

谢谢支持
4 楼 mnieguomin 2013-08-13  
讲得蛮不错的,支持下
3 楼 zzq19860626 2013-08-12  
huang305585796 写道
还不够有趣生动 。我看到csdn上面 的
http://blog.csdn.net/guolin_blog/article/details/9153753 这个人的博客 很生动有趣 。也是讲设计模式。

恩,谢谢,我会更加努力把这一系列写好的。你发的是个组合模式的,组合模式的请看我这篇http://alaric.iteye.com/blog/1910919
2 楼 huang305585796 2013-08-12  
还不够有趣生动 。我看到csdn上面 的
http://blog.csdn.net/guolin_blog/article/details/9153753 这个人的博客 很生动有趣 。也是讲设计模式。
1 楼 hailongshih 2013-08-12  
很好的设计模式,学习中

相关推荐

    Java设计模式 版本2

    Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...

    java设计模式

    10.3 模板方法模式的应用 10.4 模板方法模式的扩展 10.5 最佳实践 第11章 建造者模式 11.1 变化是永恒的 11.2 建造者模式的定义 11.3 建造者模式的应用 11.4 建造者模式的扩展 11.5 最佳实践 第12章 代理模式 12.1 ...

    深入浅出设计模式(中文版电子版)

    5.10TemplateMethodPattern(模板方法模式) 272 5.10.1定义 272 5.10.2现实例子——厨师烹调 274 5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用...

    深入浅出设计模式(中文版)

    5.10TemplateMethodPattern(模板方法模式) 272 5.10.1定义 272 5.10.2现实例子——厨师烹调 274 5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用...

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

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

    design-pattern-java.pdf

    算法的封装与切换——策略模式(四) 模板方法模式-Template Method Pattern 模板方法模式深度解析(一) 模板方法模式深度解析(二) 模板方法模式深度解析(三) 访问者模式-Visitor Pattern 操作复杂对象结构——...

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

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

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

    pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5...

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

    pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    模板方法模式 访问者模式 设计案例 UML 架构 系统架构能力 基本理论 扩展性设计 可用性设计 可靠性设计 一致性设计 负载均衡设计 过载保护设计 协议设计 二进制协议 文本协议 接入层架构设计 DNS...

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

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

    设计模式Demo

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 二、设计...

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

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

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

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

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

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

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

    pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5...

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

    pattern/src/behavior/templatemethod //13.2模板方法模式 pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5...

    Java性能调优实战——覆盖80%以上的Java应用调优场景

    模块四热点问题解答26讲单例模式:如何创建单一对象优化系统性能27讲原型模式与享元模式:提升系统性能的利器32讲MySQL调优之SQL语句:如何写出高性能SQL语句33讲MySQL调优之事务:高并发场景下的数据库事务调优34讲...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

Global site tag (gtag.js) - Google Analytics