模板方法模式之抽象类继承

  1. Test.java
package com.demo_type.pattern.template;

public class Test {

	public static void main(String[] args) {

		System.out.println("制备咖啡...");
		RefreshBeverage coffee = new Coffee();
		coffee.prepareBeverageTemplate();
		System.out.println("客官,咖啡好了...");

		System.out.println("**************************");
		System.out.println("制备茶...");
		RefreshBeverage tea = new Tea();
		tea.prepareBeverageTemplate();
		System.out.println("客官,您要的上等好茶好了...");
	}

}

2.  RefreshBeverage.java (提神饮料)

package com.demo_type.pattern.template;

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

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

	/*
	 * 基本方法,降水煮沸,父子类行为都一样,所以设为private,
	 */
	private void boilWater() {

		System.out.println("将水煮沸");
	}

	/*
	 * 抽象的基本方法,泡制饮料
	 * --话说这里能将protected 变为public么?当然不要这样了,这样到处都能访问这个类和这个抽象方法了
	 */
	protected abstract void brew();

	/*
	 * 基本方法,倒入的动作,父子类行为都一样,所以设为private,
	 */
	private void pourInCup() {
		// TODO Auto-generated method stub
		System.out.println("将水倒入杯中");

	}

	/*
	 * 抽象的基本方法,加入冲泡元素
	 */
	protected abstract void addCondiments();

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

}

3.Coffee.java

package com.demo_type.pattern.template;

public class Coffee extends RefreshBeverage{

	@Override
	protected void brew() {

		System.out.println("用沸水冲泡咖啡");
	}

	@Override
	protected void addCondiments() {

		System.out.println("加入糖和牛奶");
	}

}

4.Tea.java

package com.demo_type.pattern.template;

public class Tea extends RefreshBeverage{

	@Override
	protected void brew() {

		System.out.println("89度泡5分钟");

	}

	@Override
	protected void addCondiments() {

		System.out.println("加入柠檬");
	}
	//如果不想要加柠檬

	@Override
	protected boolean isCustomerWantsCondiments(){
		return false;
	}

}
时间: 2024-08-25 08:47:05

模板方法模式之抽象类继承的相关文章

JavaScript设计模式与开发实践 模板方法模式

一.模板方法模式的定义和组成 模板方法模式是一种只需使用继承就可以实现的非常简单的模式. 模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类.通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序.子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法. 二.第一个例子--Coffee or Tea 我们先来泡一杯咖啡,泡咖啡的步骤通常如下: 把水煮沸 用沸水冲泡咖啡 把咖啡倒进杯子 加糖和牛奶 var Coffee

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

一.引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历.在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概

设计模式(八)the Template method 模板方法模式(类行为型)

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

设计模式 ( 二十 ): Template method模板方法模式 -- 行为型

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

设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

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

深入浅出设计模式——模板方法模式(Template Method Pattern)

模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意.模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较高的模式. 模式定义模

设计模式四:模板方法模式

模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. Template Method Pattern:  Define the skeleton of an algorithm in an  operation, deferring some steps to subclasses. Template Method lets  subclasses redefine certain steps of an

C#设计模式之行为类模式:模板方法模式

定义(Template Method) 定义一个操作中算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 启示 组装电脑一般包含三个部分,主机.显示器.输入设备(键鼠),而不同品牌电脑的组装都各不相同,但是最终组装成一部完整的电脑的步骤都是固定一样的.定义抽象类,暴露主机.显示器.输入设备(键鼠)的组装给具体厂商去实现,提供一个公共的最终组装方法. /// <summary> /// 组装电脑 /// </summary> pub

【15】模板方法模式(Template Method)

一.引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等.在现实生活中,模板的概念就是--有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它.例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后,我们可以根据自己的情况填充不同的内容,以完成属于自己的简历.在设计模式中,模板方法模式中模板和生活中模板概念非常类似.下面让我们详细介绍模板方法的定义,大家可以根据生活中模板的