`

设计模式:模版模式(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 通信应该被封装还是被...

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

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

    模板模式Template Pattern

    模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

    设计模式PPT

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

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

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

    32种设计模式

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

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

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

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

    33种JAVA设计模式DEMO

    模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate ...

    C#设计模式.PDF

    设计模式(21)-Template Method Pattern 204 一、 模板方法(Template Method)模式 204 二、 模版方法模式的结构 204 三、 模板方法模式的示意性代码 205 四、 继承作为复用的工具 207 五、 一个实际应用模板方法...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合...

    C#版 24种设计模式

    工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...

    C#设计模式大全

    设计模式(21)-Template Method Pattern 一、 模板方法(Template Method)模式 二、 模版方法模式的结构 三、 模板方法模式的示意性代码 四、 继承作为复用的工具 五、 一个实际应用模板方法的例子 六、 ...

    24种设计模式与6大设计原则

    模板方法模式[TEMPLATE METHOD PATTERN] 建造者模式[BUILDER PATTERN] 策略模式 代理模式 单例模式 多例模式 工厂方法模式 抽象工厂模式 门面模式 适配器模式 模板方法模式 建造者模式 桥梁模式 命令模式 装饰模式 ...

    设计模式_模板方法模式.zip

    在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 模板方法模式 java ...

    C#设计模式(23种设计模式)

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

    设计模式代码——c#

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

    设计模式 design pattern

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

    Python设计模式之模板方法模式实例详解

    本文实例讲述了Python设计模式之模板方法模式。分享给大家供大家参考,具体如下: 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的...

Global site tag (gtag.js) - Google Analytics