Java模版方法模式

1. 什么是模版方法?

--算法执行的统一框架,模版方法模式定义了一个操作中的算法骨架,将一些步骤延迟到子类实现,使得子类可以在不改变算法结构的同时就重新定义该算法的某些特定步骤。

----Step1、Step2、....Step n

2.

模板方法(使用抽象父类定义框架)

抽象父类,为所有子类提供一个算法框架

步骤:

(1)、定义一个公共的抽象父类

(2)、定义一个公共 final 的方法(封装所有子类都要遵循的算法框架)

(3)、算法框架中定义的方法子类实现相同的使用 private 修饰该方法并且实现,子类实现方法不一样的使用 protected abstact 修饰该方法并且不实现

(4)、让子类重写父类未实现的方法,实现各自的方法

(5)、在调用的实例对象采用 父类 实例名 = new 子类,在直接调用遵循的框架方法

例子1:

/*抽象父类,为所有子类提供一个算法框架
 * step 1: 进门取号
 * step 2: 填写单据
 * step 3: 等待叫号
 * step 4: 窗口办理
 * */
public abstract class Template {

	//定义一个公共 final 的方法(封装所有子类都要遵循的算法框架)
	public final void prepareTemplate()
	{
		//进门取号
		takeNum();
		//填写单据
		writeDoc();
		//等待叫号
		waitCallNum();
		//窗口办理
		handle();

	}

	//算法框架中定义的方法子类实现相同的使用 private 修饰该方法并且实现
	private void takeNum()
	{
		System.out.println("进门取号");
	}
	private void waitCallNum()
	{
		System.out.println("等待叫号");
	}
	//子类实现方法不一样的使用 protected abstact 修饰该方法并且不实现
	protected abstract void writeDoc();
	protected abstract void handle();

}
public class Example extends Template{

	@Override
	protected void writeDoc() {
		// TODO Auto-generated method stub
		System.out.println("填写存款单据");
	}

	@Override
	protected void handle() {
		// TODO Auto-generated method stub
		System.out.println("处理存款");

	}

}
public class Example2 extends Template{

	@Override
	protected void writeDoc() {
		// TODO Auto-generated method stub
		System.out.println("填写转账单据");

	}

	@Override
	protected void handle() {
		// TODO Auto-generated method stub
		System.out.println("处理转账");

	}

}

测试:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

			Template template = new Example();
			template.prepareTemplate();
			System.out.println("-------------------");
			template = new Example2();
			template.prepareTemplate();

	}

}

输出结果:

进门取号
填写存款单据
等待叫号
处理存款
-------------------
进门取号
填写转账单据
等待叫号
处理转账

3.可以使用钩子方法使模版方法模式更加灵活

用钩子函数实现子类对算法框架个性化的扩展(简单来说就是通过钩子动态添加步骤)

思想

(1)、框架通过提供一个个的钩子,使框架具备了更大的灵活性。不想执行算法框架中的某些个步骤,我们可以脱钩,如果想执行的话,我们可以挂钩。

实现

(2)、在抽象类中,提供protected钩子方法。这是个实现的或空的方法。这样子类就可以选择覆写-持钩,也可以选择不覆写-脱勾。

使用

(3)、提供一个isXXX类型的钩子方法。用该方法控制算法框架中

某个步骤是否执行

(4)、子类不覆写这个方法,就是脱钩,仍按框架逻辑执行,一旦覆写,就是挂钩,将改变框架算法方向,按子类逻辑执行。

例子2:

/*抽象父类,为所有子类提供一个算法框架
 * step 1: 进门取号
 * step 2: 填写单据
 * step 3: 等待叫号
 * step 4: 窗口办理
 * step 5: 是否需要转到专门窗口办理(根据用户选择)
 * */
public abstract class Template {

	//定义一个公共 final 的方法(封装所有子类都要遵循的算法框架)
	public final void prepareTemplate()
	{
		//进门取号
		takeNum();
		//填写单据
		writeDoc();
		//等待叫号
		waitCallNum();
		//窗口办理
		handle();
		if(isHandleAgain())
		{
			handle();
		}

	}

	//算法框架中定义的方法子类实现相同的使用 private 修饰该方法并且实现
	private void takeNum()
	{
		System.out.println("进门取号");
	}
	private void waitCallNum()
	{
		System.out.println("等待叫号");
	}
	//子类实现方法不一样的使用 protected abstact 修饰该方法并且不实现
	protected abstract void writeDoc();
	protected abstract void handle();

	/*
	 * Hook, 钩子函数,提供一个默认或空的实现
	 * 具体的子类可以自行决定是否挂钩以及如何挂钩
	 * 询问用户是否加入调料
	 */
	 protected boolean isHandleAgain() {
		return false;
	}

}
public class Example3 extends Template{

	@Override
	protected void writeDoc() {
		// TODO Auto-generated method stub
		System.out.println("填写单据1,2");

	}

	@Override
	protected void handle() {
		// TODO Auto-generated method stub
		System.out.println("处理单据");

	}

	//需要挂钩
	@Override
	protected boolean isHandleAgain() {
		// TODO Auto-generated method stub
		return true;
	}

}

测试:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

			Template template = new Example();
			template.prepareTemplate();
			System.out.println("-------------------");
			template = new Example2();
			template.prepareTemplate();
			System.out.println("-------------------");
			template = new Example3();
			template.prepareTemplate();
	}

}

输出结果:

进门取号
填写存款单据
等待叫号
处理存款
-------------------
进门取号
填写转账单据
等待叫号
处理转账
-------------------
进门取号
填写单据1,2
等待叫号
处理单据
处理单据

5. 总结

模版方法模式

适用场景:

A、算法或者操作遵循相似的逻辑

B、重构时(把相同的代码抽取到父类中)

C、重要、复杂的算法,核心算法设计为模板算法

优点:

A、封装性好

B、复用性好

C、屏蔽细节

D、便于维护

缺点:继承

时间: 2024-10-10 09:53:15

Java模版方法模式的相关文章

Java设计模式の模版方法模式

概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 比如定义一个操作中的算法的骨架,将步骤延迟到子类中.模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤. 模式中的角色 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架. 具体类(ConcreteClass):实

设计模式(java)--模版方法模式之任务分配

转自:http://blog.csdn.net/zhengzhb/article/details/7405608 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就

NET设计模式 第二部分 行为型模式(15):模版方法模式(Template Method)

摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Template Method模式 4.适用性及实现要点 概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识. 意图 定义一个操作中的算法的骨架,而将一些

设计模式 -- 模版方法模式

模板方法模式:定义一个算法的执行骨架,将具体的算法实现延迟到子类完成. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤.代表这些具体逻辑步骤的方法称做基本方法(primitive method):而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来. 举个例子: 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃

由AbstractQueuedSynchronizer和ReentrantLock来看模版方法模式

在学完volatile和CAS之后,近几天在撸AbstractQueuedSynchronizer(AQS)的源代码,很多并发工具都是基于AQS来实现的,这也是并发专家Doug Lea的初衷,通过写一个这样的基础工具来提高j.u.c的灵活性.具体可以看这篇论文的一段原文,我摘录一下: As is well-known (see e.g., [2]) nearly any synchronizer can be used to implement nearly any other. For exa

设计模式之行为型模式—— 3.6 模版方法模式

<?php /**  * 3.6 模版方法模式  *  定义:  *  定义一个操作中的算法的骨架,而将一些步骤延  *  迟到子类中.模版方法是的子类可以不改变一个  *  算法的结构即可重定义该算法的某些特定步骤.  *  角色:  *  1. 抽象模版方法类  *  职责:定义并实现了一个模版方法.这个模  *    版方法一般是一个具体方法,它给出  *    了一个顶级逻辑的骨架,而逻辑的组  *    成步骤在相应的抽象操作中,推迟到  *    子类实现.顶级逻辑也有可能调用一  

设计模式 模版方法模式 展现程序员的一天

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现.定义还算清晰,下面来个例子展示下本公司的上班情况(纯属娱乐,如有雷同,请对号入座).简单描述一下:本公司有程序猿.测试

设计模式之模版方法模式

1.模版方法模式简介: a.模版方法模式的简单介绍: -  模版方法模式是编程中经常用到模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提上重新定义该算法的某些特定步骤. b.核心:处理某个流程中的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用模版方法模式,将这个节点的代码实现转移给子类中完成.即:处理步骤父类中定义好,具体实现延迟到子类中定义. 2.简单的代码演示: 在 BankTemplateMethod 类中添加

Python设计模式——模版方法模式

1.模版方法模式 做题的列子: 需求:有两个学生,要回答问题,写出自己的答案 #encoding=utf-8 __author__ = '[email protected]' class StudentA(): def answer1(self): print '题目一:XXXXXX' print '我的答案是:B' def answer2(self): print '题目一:XXXXXX' print '我的答案是:B' class StudentB(): def answer1(self):