模板方法模式

抓住问题的核心-模板方法模式

模式定义

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

使用场景

  1. 多个子类有公有的方法,并且逻辑基本相同时
  2. 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
  3. 重构时,模板方法是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

简单实现

模板方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package TemplatemethodMode;

public abstract class AbstractComputer {
    protected void powerOn(){
        System.out.println("开启电源");
    }
    protected void checkHardware(){
        System.out.println("硬件检查");
    }
    protected void loadOS(){
        System.out.println("载入操作系统");
    }
    protected void login(){
        System.out.println("小白的计算机无验证,直接进入系统");
    }

    public final void startUp(){
        System.out.println("------关机 START-------");
        powerOn();
        checkHardware();
        loadOS();
        login();
        System.out.println("------关机 END --------");
    }

}

具体实现类A

1
2
3
4
5
6
7
8
package TemplatemethodMode;

public class CoderComputer extends AbstractComputer {
    @Override
    protected void login() {
        System.out.println("程序员只需要进行用户和密码验证就可以了");
    }
}

具体实现类B

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package TemplatemethodMode;

public class MilitaryComputer extends AbstractComputer {
    @Override
    protected void checkHardware() {
        System.out.println("检查硬件防火墙");
    }

    @Override
    protected void login() {
        System.out.println("进行指纹识别等复杂的用户验证");
    }
}

测试类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package TemplatemethodMode;

public class Client {
    public static void main(String[] args) {
        AbstractComputer computer=new CoderComputer();
        computer.startUp();

        computer=new MilitaryComputer();
        computer.startUp();

    }
}

执行结果

ddd.png

总结

流程封装,也就是把某个固定的流程封装到一个final函数中, 并且让子类能够定制这流程中的某些或者所有步骤,这就要求父类提供共用的代码,提升代码的复用率,同时也带来了更好的可拓展性。

优点

  1. 封装不变部分,拓展可变部分
  2. 提取公共部分代码,便于维护

缺点

模板方法会带来代码阅读的难度,会让用户觉得难以理解