模板方法设计模式

最近看spring源码涉及到了模板方法模式,先简单梳理一下基本设计思想、场景和示例。
思想: 定义一个操作算法中的框架,而将这些步骤延迟加载到子类中。把一个流程中不确定的那部分抽离出来供子类实现  通过子类的实现干预父类的方法的业务流程,钩子方法挂载到父类方法中执行 它的本质就是固定算法框架。
适合的场景
  • 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
  • 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
实现的思路:父类(抽象模板类)定义抽象方法或者钩子方法以及模板方法(流程逻辑代码 里面是对抽象方法或钩子方法的调用),不同的子类继承模板类重写钩子方法或抽下方法,这样不同的子类去调用继承自父类的模板方法(流程方法)时,其中对钩子方法或者抽象方法调用的那一部分逻辑是由子类实现的。但是整个父类定义的流程不变。
模板模式的关键是:子类可以置换掉父类的可变部分(钩子方法),但是子类却不可以改变模板方法所代表的顶级逻辑(模板方法)。
 
如模板方法模式结构图所知,有两个类:
  • AblstractClass(抽象类):在抽象类中定义了一系列的操作PrimitiveOperation,每个操作可以使具体的,也可以是抽象的,每个操作对应一个算法的步骤,在子类中可以重新定义或实现这些步骤。TmplateMethod()这个方法用于定义一个算法结构,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
  • ConcreteClass(具体子类):用于实现在父类中声明的抽象基本操作,也可以覆盖在父类中已经实现的具体基本操作。
看一个简单示例:
1、创建一个抽象模板结构(AblstractClass)
public abstract class AblstractClass {

//模板方法用来控制子类执行人生顺序 按父亲要求什么人生阶段干什么事
//声明final不让子类覆盖这个方法,防止改变人生顺序
public final void life(){
//... study(); work(); love(); } public void study(){ System.out.println("刻苦学习 重点学好语数外.."); } public void work(){ System.out.println("从一而终"); } //抽象方法 让儿子自己覆盖 自由恋爱 public abstract void love(); }

2、创建一个具体子类(ConcreteClass)儿子,实现钩子方法(定义自己的爱情)

public class ConcreteClass extends AblstractClass {
 
//儿子不认可父亲的学习看法
@Override
public void study() {
   System.out.println("我要全面学习 我爱编程");
}
 
//父亲给了儿子爱情自由的权利
@Override
public void love() {
   System.out.println("自由追求自己的爱情...");
 } 
}

 测试,执行人生:

public class TestMain {
public static void main(String[] args) { AblstractClass cs = new ConcreteClass(); cs.life(); } }

结果输出:

我要全面学习 我爱编程

从一而终

自由追求自己的爱情...

以上是模板方法设计模式基本思想与简单示例。

posted @ 2019-05-11 15:27  PencyNoBug  阅读(136)  评论(0)    收藏  举报