设计模式之模板方法模式

模板方法模式定义了一套固定的算法流程,并将部分步骤抽象为具体或抽象方法,由子类实现。它遵循好莱坞原则,确保低层组件不调用高层组件。模式包括模板方法、实现方法和钩子,常用于Java的sort()方法。模板方法与策略模式不同,前者使用继承,后者采用组合。同时,它与工厂方法模式区分在于,模板方法关注算法流程,而工厂方法专注于对象创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是模板方法模式

概念:模板方法,顾名思义,就是提供一个模板给子类使用,执行这个方法,会按照一套既定的流程去执行,模板方法规定了方法执行过程中需要经历的步骤,这些步骤(方法)具体执行什么内容,它并不关心,这些方法可能是继承来的final方法,有可能是需要子类去实现的方法。直接贴出我的代码,模板方法模式的基本结构就一目了然了:

public abstract class CaffeineBeverageWithHook {
	/**
	 * 模板方法,所有继承它的子类调用这个方法都要按照这个流程去走
	 */
	public final void prepareRecipe(){
		boilWater();//已经被实现的方法
		brew();//需要子类去实现的方法
		pourInCup();//已经被实现的方法
		if(customerWantsCondiments()){   //钩子,判断是否执行内部代码
			addCondiments();//需要子类去实现的方法
		}	
	}	
	public abstract void brew();//抽象方法	
	public abstract void addCondiments();//抽象方法	
	/**
	 * 已经实现了的方法,且不能修改
	 */
	public final void boilWater(){
		System.out.println("Boiling water");
	}
	/**
	 * 已经实现了的方法,且不能修改
	 */
	public final void pourInCup(){
		System.out.println("Pouring into cup");
	}	
	/**
	 * 钩子方法,可重写覆盖(根据返回值用于判断)
	 * @return
	 */
	public boolean customerWantsCondiments() {
		return true;
	}
}

模板方法模式的几个组成部分

1、模板方法:这个方法一般可以定义为final,表示这个方法不能被子类修改,子类需要按照这个方法内的既定流程去执行,如上述代码的准备食谱这个方法,它包括烧水、酿造、加杯、添加调料四个步骤。不管子类是什么饮料,调用这个方法都必须执行这个步骤。
2、实现的方法和抽象方法:在模板方法中有许多方法的调用,那些变化的部分一般在父类中被定义为抽象方法,所有子类都相同的部分就在父类中具体实现(此时也定义为final)。
3、钩子:钩子可以抽象地理解为一个方法从调用处到执行处中间的连线处所挂的一个钩子,方法的调用都需要通过钩子,钩子可以是一个,也可以是多个。钩子的作用就是进行判断,根据判断结果觉得是否允许执行后续方法,所以钩子可以是用来判断的方法,返回一个true或者false作为判断条件。即if(钩子){…}。钩子的应用在JFrame中有体现,它的paint()方法就是一个钩子,其中写了在画板上画的内容,每一次更新显示都要调用repaint()方法来触发它的代码块。

模板方法模式和其他设计模式的比较

模板方法模式在Java中的应用:java中的sort()方法中有swap()和compareTo()方法,swap()方法是在父类中以及被实现的,作用是交换两个元素,而compareTo()方法需要被重写,实现不同的比较。
好莱坞原则:这是模板方法模式引入的一种设计原则,它表示的含义是:高层组件可以调用底层组件,而低层组件绝对不允许调用高层组件,底层组件之间也不允许调用。好莱坞原则可以避免产生“依赖腐败”现象,“依赖腐败”是一种环形的引用关系,比如父类引用子类,子类引用边缘类,边缘类引用父类,形成一种环形的引用关系,这会导致代码的逻辑设计令人难以理解。而好莱坞原则是指上层组件调用下层组件,符合依赖倒置原则,下层组件依赖于上层组件。
模板方法模式和策略模式的比较:模板方法模式采用的是继承,策略模式采用的是组合(把重复的部分抽象为接口),目标方法模式可以使用继承和重写,增加系统的弹性。
模板方法模式和工厂方法模式的区别:工厂方法是只对于对象创建的方法封装,而模板方法模式是指把一个方法定义为抽象由子类实现,工厂方法模式可以理解为把对象创建的方法延迟到子类去实现。他们的区别是工厂方法模式是把创建对象的方法抽象,且工厂方法模式没有“模板”方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值