模版方法(Template Method)——类行为型模式

模版方法模式的意图:

定义一个操作中的算法的骨架,TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。即父类已经把算法的流程定义好了,子类只需要改变其中的某些步骤的实现。

就像我们要把东西放入冰箱中,需要的一套完整的流程即为; 打开冰箱,放入物品,关闭冰箱。其中打开和关闭都是固定的,而放入的物品则是不确定的,所以放入的物品需要我们在子类中来具体实现。实例化对象之后,去调用父类中的流程方法(TempleteMethod),就可以完成整个过程。这就是模版方法导致的一种反向控制结果,即让子类去找父类的方法。具体代码后面将会实现。

模版方法模式的结构图如下:

AbstractClass抽象类实现了一个模版方法,定义了一个算法的骨架,模版方法可以调用AbstractClass类中的方法,也可以调用其它类中的方法。

ConcreteClass实现父类操作中的某些特定子类相关的步骤。

模版方法模式的Java代码实现如下:

定义一个AbstractClass有模版方法和其它的模版固定方法,以及子类需要修改的抽象方法。

<pre name="code" class="java">package templatemethod;
/**
 * 以向冰箱里放东西为例
 */
public abstract class AbstractClass {
	//模版方法
	public void templeteMethod(){
		open();
		putObject();
		close();
	}
	//开冰箱
	public void open(){
		System.out.println("开冰箱...");
	}
	//放东西
	public abstract void putObject();
	//关冰箱
	public void close(){
		System.out.println("关冰箱...");
	}
}

两个具体子类实现的抽象方法:

package templatemethod;

public class ConcreteClassA extends AbstractClass{

	@Override
	public void putObject() {
		System.out.println("向冰箱里放入水果...");
	}
}
package templatemethod;

public class ConcreteClassB extends AbstractClass {

	@Override
	public void putObject() {
		System.out.println("向冰箱中放入蔬菜...");
	}
}

测试类:

package templatemethod;

public class TestMain {
	public static void main(String[] args) {
		AbstractClass a;
		//实例化ConcreteClassA()
		a = new ConcreteClassA();
		a.templeteMethod();
		//实例化ConcreteClassB
		a = new ConcreteClassB();
		a.templeteMethod();
	}
}

模版方法模式的适用性:

1、一次性实现一个算法的不变的部分,并将可变的部分留给子类来实现。

2、各子类中公共的行为应该被提取出来并集中到一个公共父类中避免重复代码。

3、控制子类扩展。

总结:

模版方法模式是一种类行为模式,与对象无关。而且模版方法模式可以通过子类去找父类的方法。他可以减少很多重复性代码,所以在好多框架中模版方法的使用还是比较多的,最为经典的就是在Spring中的使用,希望大家可以去了解了解。

时间: 2024-08-26 14:55:13

模版方法(Template Method)——类行为型模式的相关文章

Template Method(模板方法)模式

1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->办理具体业务->对银行工作人员进行评分.取号取号排队和对银行工作人员进行评分业务逻辑是一样的.但是办理具体业务是个不相同的,具体业务可能取款.存款或者转账. 2.问题 如何保证架构逻辑的正常执行,而不被子类破坏 ? 3.解决

设计模式(十五)模板方法模式(Template Method)-行为型

有很多个方法,在多个地方都会用到,为了减少多次重复的操作,选择模板方法模式将这些方法聚在一起做成一个模板形式,从而减少客户端的代码复杂度.实现原理图如下: 模板方法模式实现原理图 抽象的骨架类的示意代码如下: public abstract class Template { public void doSalary(){ operation1(); operation2 (); operation3 (); } public abstract void operation1(); public

一道题采用两种设计模式:对比策略模式和模版方法

摘要 <C++ Primer>习题14.38和14.39分别采用策略模式.模版方法解决问题. 问题 <C++ Primer 5th>习题 14.38 : 编写一个类令其检查某个给定的 string 对象的长度是否与一个阀值相等.使用该对象编写程序,统计并报告输入的文件中长度为 1 的单词有多少个.长度为 2 的单词有多少个........长度为 10 的单词有多少个. <C++ Primer 5th>习题 14.39 : 修改上一题的程序令其报告长度在 1 至 9 之间

设计模式 笔记 模版方法模式 Template Method

//---------------------------15/04/28---------------------------- //TemplateMethod 模版方法模式----类行为型模式 /* 1:意图: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不改变 一个算法的结构即可重定义该算法的某些特定步骤. 2:动机: 3:适用性: 1>一次性实现算法的不变的部分,并将可变的行为留给子类来实现. 2>各子类中的公共行为应被提取出来并集中

设计模式之模板方法模式(Template Method)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

java 策略模式 模板方法 (Template method) 示例

<pre name="code" class="cpp">package org.rui.pattern; import junit.framework.TestCase; /** * 分解共同性(Factoring Commonality ) * 应用"一次且只能有一次" 原则产生最基本的模式,将变化的那部分代码放到方 法里. 这可以用两种方法来表达: 策略模式(Strategy * ):运行时刻选择算法 另外,Strategy 模

设计模式之行为型模式(四)

行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配. 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为.由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性. 行为型模式是 GoF 设计模式中最为庞大的一类,它包含以下 11 种模式. 模板方法(Template Method)模式:定义

创建型模式杂谈

[本文首发于cnblogs    作者:byeyear    Email:[email protected]    转载请注明] 本文是关于创建型模式的杂谈,全文的组织结构比较松散,但基本上还是依着原文的编写顺序来谈. A. 约定 使用”产品“来指代中间产品(如Room.Door.Wall等): 使用”成品“来指代最终的产品(如Maze). B. 创建型模式分类 创建型模式可分为两类:类创建型模式和对象创建型模式. B.1 类创建型模式使用继承改变被实例化的类,例如Factory Method,

设计模式(五):PROTOTYPE原型模式 -- 创建型模式

1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂模式与抽象工厂都是通过工厂封装具体的new操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景的时候,可能使用原型模式更简单也效率更高. • 1)当一个系统应该独立于