`

设计模式:模版模式(Template Pattern)

阅读更多

模版模式

又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤。

 

我们使用冲泡咖啡和冲泡茶的例子

加工流程:

咖啡冲泡法:1.把水煮沸、2.用沸水冲泡咖啡、3.把咖啡倒进杯子、4.加糖和牛奶

茶冲泡法:   1.把水煮沸、2.用沸水冲泡茶叶、3.把  茶 倒进杯子、4.加蜂蜜

 

实践步骤:

1>创建一个模板(抽象)类:Beverage(饮料)

 

 

package com.kaishengit.beverage;

public abstract class Beverage {
	/**
	 * 冲泡咖啡或茶...流程
	 */
	public final void create(){
		boilWater();//把水煮沸
		brew();//用沸水冲泡...
		pourInCup();//把...倒进杯子
		addCoundiments();//加...
	}


	public abstract void addCoundiments();

	public abstract void brew();
	
	public void boilWater() {
		System.out.println("煮开水");
	}
	
	public void pourInCup() {
		System.out.println("倒进杯子");
	}
}

 

 2>创建一个咖啡类(Coffee)和茶(Tea)类,都继承Beverage抽象类

1.咖啡(Coffee)

 

package com.kaishengit.beverage;

public class Coffee extends Beverage{

	@Override
	public void addCoundiments() {
		System.out.println("添加糖和牛奶");	}

	@Override
	public void brew() {
		System.out.println("用水冲咖啡");
	}
}

 

 

2.茶(Tea)

 

package com.kaishengit.beverage;

public class Tea extends Beverage{

	@Override
	public void addCoundiments() {
		System.out.println("添加蜂蜜");
	}

	@Override
	public void brew() {
		System.out.println("用水冲茶");
	}

}

 

 3.我们测试一下:

 

package com.kaishengit.beverage;

public class Test {
	public static void main(String[] args) {
		Coffee coffee = new Coffee();
		coffee.create();//冲泡咖啡
		
		//Tea tea = new Tea();//冲泡茶
		//tea.create();
	}
}
 

 

 运行结果:

-----------------------------------

 

煮开水

用水冲咖啡

倒进杯子

添加糖和牛奶

 

-----------------------------------

 

 

在模版模式中使用挂钩(hook)

 

存在一个空实现的方法,我们称这种方法为”hook”。子类可以视情况来决定是否要覆盖它。

 

1>我们对模板类(Beverage)进行修改

 

 

package com.kaishengit.beverage;

public abstract class Beverage {
	/**
	 * 冲泡咖啡或茶...流程
	 */
	public final void create(){
		boilWater();//把水煮沸
		brew();//用沸水冲泡...
		pourInCup();//把...倒进杯子
		addCoundiments();//加...
		
		hook();//挂钩
	}
	//空实现方法
	public void hook(){}

	public abstract void addCoundiments();

	public abstract void brew();
	
	public void boilWater() {
		System.out.println("煮开水");
	}
	
	public void pourInCup() {
		System.out.println("倒进杯子");
	}
}

 2>假如我们搞活动,喝一杯咖啡送一杯,修改咖啡(Coffee)类

 

package com.kaishengit.beverage;

public class Coffee extends Beverage{

	@Override
	public void addCoundiments() {
		System.out.println("添加糖和牛奶");	}

	@Override
	public void brew() {
		System.out.println("用水冲咖啡");
	}
	
	/**
	 * 挂钩
	 */
	@Override
	public void hook() {
		System.out.println("再来一杯");
	}

}

 3>使用上面的测试类

运行结果:

--------------------------------

 

煮开水

用水冲咖啡

倒进杯子

添加糖和牛奶

再来一杯

--------------------------------

结果中有“再来一杯”...

 

 

我们也可以这样使用挂钩,让其决定里面的代码是否执行

1>我们对模板类(Beverage)进行修改

 

package com.kaishengit.beverage;

public abstract class Beverage {
	/**
	 * 冲泡咖啡或茶...流程
	 */
	public final void create(){
		boilWater();//把水煮沸
		brew();//用沸水冲泡...
		pourInCup();//把...倒进杯子
		
		//挂钩决定是否添加配料
		if(hook()){
			addCoundiments();//加...
		}
		//hook();
	}

	/**
	 * 默认添加配料
	 * @return
	 */
	public boolean hook() {
		return true;
	}

	//public void hook(){}
	
	public abstract void addCoundiments();

	public abstract void brew();
	
	public void boilWater() {
		System.out.println("煮开水");
	}
	
	public void pourInCup() {
		System.out.println("倒进杯子");
	}
}

 2>我们对Coffee类进行修改,让其不添加配料

 

package com.kaishengit.beverage;

public class Coffee extends Beverage{

	@Override
	public void addCoundiments() {
		System.out.println("添加糖和牛奶");	}

	@Override
	public void brew() {
		System.out.println("用水冲咖啡");
	}
	
	/**
	 * 有的客人不喜欢加配料
	 */
	@Override
	public boolean hook() {
		return false;
	}
	
	/*@Override
	public void hook() {
		System.out.println("再来一杯");
	}
*/
}

 3>还是使用上面的测试类

运行结果:

------------------------------------------------------

 

煮开水

用水冲咖啡

倒进杯子

------------------------------------------------------

运行结果中没有添加配料

 

关于模板模式

 

1>模板模式定义了算法的步骤,把这些步骤的实现延迟到子类

2>模板模式为我们提供了一个代码复用的技巧

3>模板抽象类中可以定义具体方法、抽象方法和钩子方法

4>为了防止子类改变模板中的算法,可以将模板方法声明为final

5>钩子是一种方法,它在抽象类中不做事,或只做默认的事,子类可以选择要不要实现它

 

-----------end--------------

9
0
分享到:
评论
2 楼 u010314339 2014-05-13  
蛮简单的,但这就是java抽象类的用途,赞一个
1 楼 xiaoLee 2012-05-02  
写的蛮好的

相关推荐

    设计模式:可复用面向对象软件的基础--详细书签版

    5.10 template method(模板方法) —类行为型模式 214 5.11 visitor(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被...

    模板模式Template Pattern

    模板模式是一种常用的行为设计模式,其核心在于定义了一个算法的框架,并允许子类提供具体的实现细节。通过这种方式,子类可以继承并重写某些方法,但整个算法的流程仍然遵循父类的结构。 #### 二、模式原理 在...

    Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现

    模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在C++这样的面向对象编程语言中。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的...

    模版方法模式TemplatePattern

    模板方法模式(Template Pattern)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。这种模式允许子类重新定义或改变某些基本操作,但整体结构和顺序保持不变。在Java编程中,...

    C++设计模式:基于Qt开源跨平台开发框架

    使用模板方法模式(Template Method Pattern)定义算法的骨架,让子类实现具体的步骤,实现代码复用。 总结来说,C++设计模式结合Qt框架,不仅能够充分利用Qt提供的强大功能,还能保证代码的高效、可维护和可扩展。...

    C++设计模式基础教程.pdf

    13. 模板方法模式(Template Method Pattern):使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 14. 命令模式(Command Pattern):将一个请求封装为一个对象,从而使你可用不同的请求对客户端...

    设计模式PPT

    创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:  工厂方法模式(Factory Method Pattern)  抽象工厂模式... 模板方法模式(Template Method Pattern)  访问者模式(Visitor Pattern)

    Java设计模式之禅

    1. 模板方法模式(Template Method Pattern):在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。 2. 命令模式(Command Pattern):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化...

    模板方法模式(Template Method Pattern)详解 1. 什么是模板方法模式? 2. 为什么需要模板方法模式? 3. 模板方法模式的核心概念 3.1 模板方法(Template Met

    8. 模板方法模式与其他设计模式的比较 8.1 模板方法模式 vs 策略模式 8.2 模板方法模式 vs 工厂方法模式 8.3 模板方法模式 vs 命令模式 9. 模板方法模式的优缺点 9.1 优点 9.2 缺点 10. 何时使用模板方法模式? 11. ...

    GOF之23种设计模式的C#实现:DesignPattern.zip

    通过阅读GOF23种设计模式.docx文档和探索DesignPattern项目中的代码,你可以深入理解每种模式的用途、优点以及如何在C#和.NET Core环境中实现它们。对于想要提升编程技能和代码质量的开发者来说,这是一个宝贵的资源...

    C#23种设计模式【完整】.pdf

    C#设计模式详解 本文档详细介绍了23种C#设计模式,包括创建型、结构型和行为型三个大类。这些设计模式是.NET进阶必备的知识,通过学习和掌握这些设计模式,可以提高程序员的设计和编码能力。 创建型设计模式 1. ...

    java设计模式详解,java design pattern

    Java设计模式详解涉及到23种设计模式,这些设计模式可以根据其目的和范围被划分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)。下面将详细...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...

    设计模式与重构(design pattern )

    设计模式不是具体的代码或库,而是一种在特定情况下解决问题的模板。它们为程序员提供了一种标准化的解决方案,使得代码更加可读、可复用和易于理解。常见的设计模式分为三类:创建型、结构型和行为型。 1. 创建型...

    设计模式整理代码-pattern.zip

    这里我们关注的是一个名为"pattern.zip"的压缩包文件,它包含了23种经典的设计模式,这些模式在实践中被广泛使用,提高了代码的可读性、可维护性和可扩展性。这篇文章将详细探讨这些设计模式及其应用。 首先,23种...

    Java的23种设计模式

    Java设计模式是指在Java编程语言中,根据软件工程原理,总结出的一系列在特定情况下用于解决特定问题的模板化代码。设计模式分为三大类:创建型、结构型和行为型,它们包含共23种不同的设计模式。 创建型模式关注的...

    C#设计模式_设计模式_C#_

    模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. ...

    design pattern设计模式范例

    本资料库中的"design pattern设计模式范例"提供了23种经典设计模式以及最新的范式用法,非常适合用于项目重构或作为学习设计模式的参考。 首先,我们来看23种经典的设计模式,它们通常分为三类:创建型、结构型和...

    32种设计模式

    C# 32种设计模式: 创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) ...

    《设计模式》DELPHI版

    5. 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。Delphi中的Virtual和Override关键字可用于...

Global site tag (gtag.js) - Google Analytics