设计模式学习之---模板方法设计模式

在我们的日常生活中,模板方法是应用的很广的,我们身边有很多模板方法的身影,举个很高大上的例子就是我们的奥运会的开幕仪式:奥委会对于不同国家举办奥运会开幕式提供的步骤都是一样的:

1.升国旗,奏国歌

2.奥委会人发言

3.文艺汇演

4.奥运运动员入场仪式

5.点燃火炬

但是,对于不同的国家,他们的内容肯定是不一样的,这就是一种模板方法。那么,我们在java的实现中,应该是怎么进行表现呢?

这里再用一个例子来演示,我们的饮料机,一个饮料机可以制作咖啡和茶:

那么我们先定义一个制作饮料的抽象基类:

package com.imooc.pattern.template;

/*
 * 抽象基类,为所有子类提供一个算法框架
 *
 * 饮料
 */
public abstract class RefreshBeverage {

	/*
	 * 制备饮料的模板方法
	 * 封装了所有子类共同遵循的算法框架
	 */
	public final void prepareBeverageTemplate(){
		//步骤1 将水煮沸
		boilWater();
		//步骤2 泡制饮料
		brew();
		//步骤3 将饮料倒入杯中
		pourInCup();
		if(isCustomerWantsCondiments()){
			//步骤4 加入调味料
			addCondiments();
		}
	}

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

	/*
	 * 基本方法,将水煮沸
	 */
	private void boilWater() {
		System.out.println("将水煮沸");
	}

	/*
	 * 基本方法,将饮料倒入杯中
	 */
	private void pourInCup() {
		System.out.println("将饮料倒入杯中");
	}

	/*
	 * 抽象的基本方法,泡制饮料
	 */
	protected abstract void brew();

	/*
	 * 抽象的基本方法, 加入调味料
	 */
	protected abstract void addCondiments();

}

是的,制作茶和咖啡的步骤都是一样的,唯一不同的就是炮制和加调味料的实现不一样,所以定义一个模板方法为final,再将其两个不同的方法设置为protected属性,这样方法就只能在它的子类中进行访问和修改了。就能做到不同的饮料不同的制作

所以,制作茶:

package com.imooc.pattern.template;

/*
 * 抽象基类,为所有子类提供一个算法框架
 *
 * 提神饮料
 */
public abstract class RefreshBeverage {

	/*
	 * 制备饮料的模板方法
	 * 封装了所有子类共同遵循的算法框架
	 */
	public final void prepareBeverageTemplate(){
		//步骤1 将水煮沸
		boilWater();
		//步骤2 泡制饮料
		brew();
		//步骤3 将饮料倒入杯中
		pourInCup();
		if(isCustomerWantsCondiments()){
			//步骤4 加入调味料
			addCondiments();
		}
	}

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

	/*
	 * 基本方法,将水煮沸
	 */
	private void boilWater() {
		System.out.println("将水煮沸");
	}

	/*
	 * 基本方法,将饮料倒入杯中
	 */
	private void pourInCup() {
		System.out.println("将饮料倒入杯中");
	}

	/*
	 * 抽象的基本方法,泡制饮料
	 */
	protected abstract void brew();

	/*
	 * 抽象的基本方法, 加入调味料
	 */
	protected abstract void addCondiments();

}

制作咖啡:

 package com.imooc.pattern.template;

/*
 * 具体子类,提供了咖啡制备的具体实现
 */
public class Coffee extends RefreshBeverage {

	@Override
	protected void brew() {
		System.out.println("用沸水冲泡咖啡");

	}

	@Override
	protected void addCondiments() {
		System.out.println("加入糖和牛奶");
	}

}

测试:

package com.imooc.pattern.template;

public class RefreshBeverageTest {

	public static void main(String[] args) {

		System.out.println("制备咖啡...");
		RefreshBeverage b1 = new Coffee();
		b1.prepareBeverageTemplate();
		System.out.println("咖啡好了!");

		System.out.println("\n******************************************");

		System.out.println("制备茶...");
		RefreshBeverage b2 = new Tea();
		b2.prepareBeverageTemplate();
		System.out.println("茶好了!");

	}

}

所以,模板方法最重要的就是定义一个抽象基类,模板方法定位finnal,具体子类实现抽象基类的抽象方法,实现个性化的类的操作,钩子方法的设定是让个性化更加详细。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 16:04:09

设计模式学习之---模板方法设计模式的相关文章

设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 二.模板方法模式的应用场景 Template Method模式一般应用在具有以下条件的应用中: - 具有统一的操作步骤或操作过程 - 具有不同的操作细节 - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同 private static void Main(string[] arg

设计模式(三)__模板方法设计模式

咳咳,上课. 起立. 老师再见.??? 你们就这么希望老师走吗.... 好了,同学们,今天这节课给大家介绍一下设计模式的一种——模板方法设计模式. 那么什么是模板方法设计模式呢? 当功能内部一部分实现是确定的,一部分实现是不确定的.这时可以把不确定的部分暴露出去,让子类去实现. 模板方法模式是基于继承的代码复用的基本技术,模板方法模式的结构和用法也是面向对象设计的核心. 模式中的角色: ①抽象类:实现了模板方法 ②具体类:实现抽象类中的抽象方法 通过一个例子来让大家更容易理解. 当我们需要判断一

Java学习之模板方法设计模式

(1) 模版方法定义: 在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分, 那么这时就将不确定的部分暴露出去.由该类的子类去完成. (2) 示例代码: 1 //获取某方法的执行时间 2 abstract class GetTime 3 { 4 public final void getTime() 5 { 6 long start = System.currentTimeMillis(); 7 8 runcode(); 9 10 long end = Sy

大话设计模式-->模板方法设计模式

在学习java的过程中,我们肯定听到过设计模式这名词,在行业中有这么一句话,若您能熟练的掌握23种设计模式,那么你便是大牛! 好了,废话不多说,今天我跟大家分享一下23种设计模式之一的  模板方法 设计模式 首先我们要知道什么是模板方法设计模式? 模板方法设计模式就是定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 为什么要使用模板方法设计模式? 模板方法模式是比较简单的一种设计模式,但是它却是代码复用的一项基本的

设计模式--15、模板方法模式

设计模式学习笔记-模板方法模式 1. 概述 定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤. 2. 模式中的角色 2.1 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架. 2.2 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法. 3. 模式解读 3.1 模板方法类图 3.2 模板方法模式代码实现 /// <summary> /// 抽象类 /// </summa

Java设计模式学习记录-桥接模式

前言 这次介绍结构型设计模式中的第二种模式,桥接模式. 使用桥接模式的目的就是为了解耦,松散的耦合更利于扩展,但是会增加相应的代码量和设计难度. 桥接模式 桥接模式是为了将抽象化与实现化解耦,让二者可以独立地变化.方便对每一部分的扩展,以及单独的维护.抽象化的一方与实现化的一方之间建立一个桥梁,这样两者的依赖关系就可以通过这个桥梁来建立了. 举例 三个小动物要过河,分别是小猪,小鸡,小马,小猪要去河对面的空地晒太阳,小鸡要去河对面的小树林里找虫子吃,小马要去河对面的草地里吃草.那么它们三个都要经

Java设计模式学习记录-装饰模式

前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一些图形界面构件功能的增强等地方都运用了装饰模式. 装饰模式 定义 装饰模式的定义是:在不改变原类文件以及不使用继承的情况下,动态的扩展一个对象的功能.装饰模式是通过创建一个包装对象来实现的,也就是用装饰来包裹真实的对象. 举例 还是老规矩,举例说明,在给亲朋好友过生日时会买生日蛋糕,然后生日蛋糕又有

Java设计模式学习记录-迭代器模式

前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/O的各种实现用到了什么设计模式,我愣是想半天没想出来了,人家还给提示了我也没想出来,最后还是面试官给出的答案,是装饰模式,听到答案后就恍然大悟了,前两天刚看了装饰模式,还写下了I/O操作中的各种类都是用到了装饰模式,后来想想两方面原因造成的当时没回答出来,一是面试时紧张就容易想不起来,二是对设计模式

Java设计模式学习记录-状态模式

前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使用时无需关心对象的状态,可以实现自身的一致性处理.最近工作有些忙,更新博客慢了.还是要严格要求自己的,抽时间也要坚持学习. 状态模式 概念介绍 状态模式允许一个对象在其状态改变时,改变它的行为,对象看起来似乎修改了它的类. 想要在改变自身状态时改变对象行为,最直接的方法就是在代码中将所有可能发生的情