设计模式-模板方法

模板方法模式

定义

定义操做中的算法框架,而将具体的操做定义延迟到子类中实现,使得子类在不改变算法结构的状况下依然能够从新定义
算法的某些特定步骤
理解:就像是书的目录,老师已经制定好书的章节,分配给学生按照目录完成书籍,学生按照本身的知识填写目录内容
uml

模板方法应用普遍,也比较简单,仅仅使用了Java的继承机制

AbstractParentClass 称为抽象模板,抽象模板中的方法分为两类:
· 基本方法:由子类实现的方法,
· 模板方法:通常是一个具体的方法,也就是一个算法框架(调用逻辑),实现对基本方法调度,完成固定逻辑

AClass 和 BClass 称为具体模板:主要是实现抽象模板中的基本方法

注意:为了防止恶意操做,模板方法通常都加final关键字
基本方法尽可能设计成protected类型(符合迪米特法则:不须要暴露的属性和方法尽可能设置为protected类型),若非必要不要扩大
方法的访问权限
优势

· 封装不变部分,扩展可变部分算法

把认为不可变的部分封装到父类实现,可变部分则能够经过继承来继续扩展

· 提取公共部分代码,便于维护框架

· 行为由父类控制,子类实现ide

缺点
按照设计习惯通常是定义抽象后实现,但模板方法模式定义了部分实现,子类的实现改变告终果,带来了阅读上难度
使用场景
1. 多个子类有相同的方法,且逻辑基本相同
2. 重要复杂的算法,可把核心算法封装为模板方法
3. 重构时
实现
  • 抽象模板
public abstract class AbstractCommand {

	/**
	 * HOOK METHOD
	 * @return
	 */
	protected abstract  boolean pre() ;

	protected abstract  void after() ;

	protected abstract void run();

	public final void executeRun(){
		if(pre()){
			run();
			after();
		}
	}
	
}
  • 模板实现
public class ACommand extends AbstractCommand {

	@Override
	protected boolean pre() {
		return true;
	}

	@Override
	protected void after() {
		System.out.println("执行了A after()");

	}

	@Override
	protected void run() {
		System.out.println("执行了A run()");
	}
}
public class BCommand extends AbstractCommand {

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

	@Override
	protected void after() {
		System.out.println("执行了B after()");
	}

	@Override
	protected void run() {
		System.out.println("执行了B run()");
	}
}
  • client 调用
public class Test {

	public static void main(String[] args) {
		ACommand a = new ACommand();

		BCommand b = new BCommand();

		a.executeRun();

		b.executeRun();

	}
}
扩展
增长钩子方法(Hook Method)
当须要增长外部条件时,增长钩子方法便可改变执行结果
相关文章
相关标签/搜索