设计模式-模板方法模式

来源:《设计模式之禅》

定义:

     定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些步骤。

     抽象模板方法可以分为两类:

  1. 基本方法:由子类定义,在模板方法中调用。

  2. 模板方法:定义算法的步骤。一般模板方法添加final关键字,不允许被复写。

类图:

设计模式-模板方法模式

代码:

抽象模板:

/**
 * 
 */
package cc.pattern.template;

/**
 * @author rico
 * 抽象模板类
 */
public abstract class AbstractClass {
	
	/**
	 * 基本方法
	 */
	protected abstract void doAction1();
	
	/**
	 * 基本方法
	 */
	protected abstract void doAction2();
	
	/**
	 * 模板方法,调用基本方法
	 */
	final public void templateAction() {
		this.doAction1();
		this.doAction2();
	}
}

具体模板1:

/**
 * 
 */
package cc.pattern.template;

/**
 * @author rico
 * 具体模板1
 */
public class ConcreteClass extends AbstractClass {

	/* (non-Javadoc)
	 * @see cc.pattern.template.AbstractClass#doAction1()
	 */
	@Override
	protected void doAction1() {
		System.out.println("###doAction1");
	}

	/* (non-Javadoc)
	 * @see cc.pattern.template.AbstractClass#doAction2()
	 */
	@Override
	protected void doAction2() {
		System.out.println("###doAction2");
	}

}


具体模板2:

/**
 * 
 */
package cc.pattern.template;

/**
 * @author rico
 * 具体模板2
 */
public class ConcreteClass2 extends AbstractClass {

	/* (non-Javadoc)
	 * @see cc.pattern.template.AbstractClass#doAction1()
	 */
	@Override
	protected void doAction1() {
		System.out.println("###doAction1");
	}

	/* (non-Javadoc)
	 * @see cc.pattern.template.AbstractClass#doAction2()
	 */
	@Override
	protected void doAction2() {
		System.out.println("###doAction2");
	}

}

场景:

/**
 * 
 */
package cc.pattern.template;

/**
 * @author rico
 *
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		AbstractClass clazz1 = new ConcreteClass();
		AbstractClass clazz2 = new ConcreteClass2();
		
		System.out.println("###Clazz1");
		clazz1.templateAction();
		
		System.out.println("###Clazz2");
		clazz2.templateAction();
	}

}


模板方法模式优点:

  1. 封装不变部分,扩张可变部分。

  2. 提取公共代码部分,便于维护。

  3. 行为由父类控制,之类实现。

模板方法模式缺点:

     子类的执行结果影响父类,带来代码阅读难度。

使用场景:

  1. 多个子类公有方法,并且逻辑基本相同。

  2. 重要/复杂的核心算法抽象为模板方法,各个子类实现相关的细节。

  3. 用于重构,把相同的方法抽取到父类中,通过钩子函数约束行为。

扩展: 


你可能感兴趣的:(设计模式-模板方法模式)