java 模板设计模式 详解

什么是模板设计模式:

定义一个操作中算法的骨架(或称为顶级逻辑),将一些步骤(或称为基本方法)的执行延迟到其子类中.

模板设计模式中的方法:

模板方法:必须由抽象类实现,该方法是一个顶级逻辑,调用任意多个基本方法。子类不应该修改该方法

基本方法:模板方法所调用的方法,有可细分为抽象方法,具体方法,钩子方法
     抽象方法:强迫子类重写的
     具体方法:不需要子类重写的,最好声明为final
      钩子方法:子类可以重写的,一般是个空方法(钩子方法的命名应该以do开头,这是一个通用规范)
补充:模板模式的设计理念是尽量减少必须由子类置换掉的基本方法的数量(可以理解为尽量减少抽象方法和钩子方法的数量。)

模板设计模式和继承的区别:

模板方法估计恰当地使用继承。此模式可以用来改写一些拥有相同功能的相关的类,将可复用的一般性行为代码移到基类里面,而把特殊化的行为代码移到子类里面。熟悉模板方法模式是重新学习继承的开始。

模板设计模式代码实现:

定义抽象类:

/**
 * 我想大家都熟悉炒菜的过程把,即使不会炒菜,但是步骤还是应该明白的,
 <span style="font-family: Arial;">*</span><span style="font-size: 14px; line-height: 26px; font-family: Arial;">第一步:打开电磁炉(打开煤气开火)</span><pre name="code" class="java" style="font-size: 13.63636302947998px; line-height: 25.99431800842285px;"> *<span style="font-family: Arial; font-size: 14px; line-height: 26px;">第二步:放入油 </span>
 *<span style="font-family: Arial; font-size: 14px; line-height: 26px;">第三步:放入葱姜蒜</span>
*第四步:放入菜翻炒
 *<span style="font-family: Arial; font-size: 14px; line-height: 26px;">第五步:出锅</span>
* * @author Administrator * */public abstract class ABSChaocai {protected abstract void kaiHuo();// 开火protected abstract void jiaYou();// 放入油protected abstract void putCJS();// 添加葱姜蒜protected abstract void putVegetables();// 放蔬菜翻炒protected abstract void out();// 出锅public final void operation() {// 执行,因为次方法调用的顺序是不可以改变的所以写成final的kaiHuo();jiaYou();putCJS();putVegetables();out();}}
 
   

实现类:

public class ChaoCai extends ABSChaocai {

	protected void kaiHuo() {
		System.out.println("开火");
	}

	protected void jiaYou() {
		System.out.println("放入油");
	}

	protected void putCJS() {
		System.out.println("添加葱姜蒜");
	}

	protected void putVegetables() {
		System.out.println("放蔬菜翻炒");
	}

	protected void out() {
		System.out.println("出锅");
	}

}

执行类:

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ABSChaocai chaocai=new ChaoCai();
		chaocai.operation();
	}

}

执行结果:

开火
放入油
添加葱姜蒜
放蔬菜翻炒
出锅
 
模板设计模式中还有一种钩子方法,钩子方法一般以do开头起名字。
钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。
此时的抽象方法变成以下代码:
/**
 * 我想大家都熟悉炒菜的过程把,即使不会炒菜,但是步骤还是应该明白的, 
<pre name="code" class="java" style="font-size: 13.63636302947998px; line-height: 25.99431800842285px;"> * <span style="font-size: 14px; line-height: 26px; font-family: Arial;">第一步:打开电磁炉(打开煤气开火) </span>
 * <span style="font-size: 14px; line-height: 26px; font-family: Arial;">第二步:放入油 </span>
 * <span style="font-size: 14px; line-height: 26px; font-family: Arial;">第三步:放入葱姜蒜</span>
* 第四步:放入菜翻炒
 *<span style="font-size: 14px; line-height: 26px; font-family: Arial;">第五步:出锅</span>
* * @author Administrator * */public abstract class ABSChaocai {protected abstract void kaiHuo();// 开火protected abstract void jiaYou();// 放入油protected abstract void putCJS();// 添加葱姜蒜protected abstract void putVegetables();// 放蔬菜翻炒protected abstract void out();// 出锅protected boolean doPutputCJS() {// 有的人吃不了葱姜蒜,这时候我们炒菜的时候就要考虑是否要放入,这个时候就用到了钩子方法//判断是否放入葱姜蒜,默认是添加,如果不需要子类覆盖此方法从新返回false即可return true;}public final void operation() {// 执行,因为次方法调用的顺序是不可以改变的所以写成final的kaiHuo();jiaYou();if (doPutputCJS()) {putCJS();}putVegetables();out();}}
 
   

添加钩子模式后的子类实现:

public class ChaoCai extends ABSChaocai {

	protected void kaiHuo() {
		System.out.println("开火");
	}

	protected void jiaYou() {
		System.out.println("放入油");
	}

	protected void putCJS() {
		System.out.println("添加葱姜蒜");
	}

	protected void putVegetables() {
		System.out.println("放蔬菜翻炒");
	}

	protected void out() {
		System.out.println("出锅");
	}

	protected boolean doPutputCJS() {
		return false;
	}

}
执行代码没变,执行结果:
开火
放入油
放蔬菜翻炒
出锅
以上就是模板设计模式,以及模板模式中的钩子方法使用,是不是特别简单呢。

你可能感兴趣的:(设计模式,模板,java设计模式,模板设计模式,java模板设计模式)