模版方法(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修饰的抽象方法,不同的实现类可以有不同的实现,这也是模版方法模式的用意。如果你了解策略模式,你会发现在每条算法的封装上很像策略模式,而又不是策略模式,策略模式是利用委派的方法提供不同的算法行为,而模版方法是利用继承来提供不同的算法行为的。
相关推荐
java的23种常用设计模式:模板方法模式
使用模板方法模式显示某个目录下的全部文件的名字,比如可以按文件的大小顺序、按最后修改的时间顺序或按文件名字的字节顺序来显示某个目录下的全部文件的名字。
适合20分钟左右讲解的模板方法模式。 自己上课用的。
模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
设计模式-模板方法模式(讲解及其实现代码)
设计模式C++学习之模板方法模式(Template Method)
设计模式模板方法模式PPT学习教案.pptx
模板方法模式的示例代码和文档,学习模板方法模式的参考资料。
模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一。在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。 在模板方法模式中,我们...
策略模式结合模板方法模式
iOS模板方法模式使用心得demo
处理层的设计采用了设计模式中的策略模式、模板方法模式和工厂模式。 Server端和Client端的实现也采用了分层的设计方式,包含自定义的模型层、视图层和控制层。 说明:程序采用配置文件的方式进行初始化,运行时时请...
模板方法模式例子代码
设计模式--模板方法模式java例子
Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现
将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载。
设计模式的模板方法模式的例子,希望对大家有用~~~~~~~~