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

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设计模式源代码——自己看pdf写的

    以上只是部分Java设计模式的介绍,实际的“DesignPatterns”压缩包可能包含了这些模式的源代码实现,通过阅读和学习这些代码,开发者可以更好地理解和运用设计模式,提升代码质量。同时,结合博主提供的博客链接,...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    《Java设计模式》是刘伟老师的一本经典教材,它深入浅出地讲解了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的通用解决方案,是软件开发中的智慧结晶。这本书的课后习题和...

    Java设计模式——代理设计模式(静态代理和动态代理)

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在不修改原有对象的基础上,为对象添加额外的功能或者...

    设计模式-Java语言中的应用(pdf)

    通过深入学习《设计模式——Java语言中的应用》,开发者能够更好地理解和应用这些模式,从而编写出更加高效、可扩展的Java程序。无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    java设计模式

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

    java设计模式(23种设计模式大全)

    根据提供的标题、描述以及部分内容,本文将深入探讨Java设计模式,并着重分析23种常见的设计模式,以帮助Java程序员更好地理解和应用这些模式。 ### Java设计模式概述 Java设计模式是面向对象软件设计的一种通用可...

    Java与模式(闫宏)

    《Java与模式》是闫宏大师的一部经典之作,它将古老的哲学智慧——道德经的智慧,巧妙地融入到现代编程语言Java的设计模式之中。这本书不仅深入浅出地讲解了23种经典的设计模式,还提供了丰富的实践案例,旨在帮助...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    java设计模式——告诉新手一些不知道的东西

    在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...

    java设计模式(1)

    ### Java设计模式(1)——理解与应用 #### 一、设计模式概述 设计模式是在软件工程领域中,为了应对特定问题或情境而形成的最佳实践集合。这些模式可以帮助开发者更高效地解决常见问题,提高代码的可重用性和可...

    115个Java面试题和答案——终极列表

    Java面试题是每个Java开发者在求职过程中必须面对的挑战,涵盖范围广泛,从基础概念到高级特性和设计模式。这份终极列表包含115个Java面试题和答案,旨在帮助求职者全面准备,以期在面试中表现出色。以下是部分核心...

    设计模式——JAVA.docx

    ### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...

    运用java设计模式写的俄罗斯方块游戏,包含源代码

    本项目是运用Java设计模式实现的一款经典游戏——俄罗斯方块,其核心在于将游戏的各个部分模块化,通过巧妙的设计和组合,实现了游戏的稳定性和可扩展性。 首先,我们来看这款游戏的核心功能。俄罗斯方块的基本玩法...

    Head.First设计模式_PDF——书中源代码

    9. **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 10. **策略模式**:定义一系列的算法,并将每一个算法封装起来,...

    Java设计模式之模板方法模式.docx

    总结来说,模板方法模式是Java设计模式中的一种常见模式,用于定义算法的结构,并允许子类在不改变整体结构的情况下重定义某些步骤。在这个悍马模型的例子中,通过调整`run()`方法的实现位置,可以更好地体现模板...

    java的设计模式 《设计模式-java语言中的应用.pdf》

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板或蓝图。...通过阅读《设计模式——Java语言中的应用》这本书,你可以更深入地学习和掌握这些模式的细节及其在实际开发中的应用。

Global site tag (gtag.js) - Google Analytics