模板方法模式,简单的说就是把子类的一些共通的东西放在抽象父类中实现,这样子类继承抽象父类,拥有了一样的东西,也不需要去写一些重复的代码。比如下面的一个类图:
上图中run方法就是子类共用的一个方法,代码都一样,子类为了减少代码,直接继承父类的run方法,实现模板的功能。
抽象类定义:
package com.jack.modelmethod;
/**
* Created by jack on 2017/8/2.
* 模版方法模式
*/
public abstract class HummerModel {
/**
* 悍马发动起来
*/
abstract void start();
/**
* 能发动还要能停下来
*/
abstract void stop();
/**
* 喇叭会响
*/
abstract void alarm();
/**
* 引擎会响
*/
abstract void engineBoom();
public void run(){
//先发动汽车
this.start();
//汽车引擎开始响
this.engineBoom();
//按喇叭
this.alarm();
//到达目的地就停车
this.stop();
}
}
子类实现1:
package com.jack.modelmethod;
/**
* Created by jack on 2017/8/2.
*/
public class HummerH1Model extends HummerModel{
@Override
void start() {
System.out.println("悍马H1发动.....");
}
@Override
void stop() {
System.out.println("悍马H1停车.....");
}
@Override
void alarm() {
System.out.println("悍马H1按喇叭.....");
}
@Override
void engineBoom() {
System.out.println("悍马H1的引擎声.....");
}
}
子类实现2:
package com.jack.modelmethod;
/**
* Created by jack on 2017/8/2.
*/
public class HummerH2Model extends HummerModel{
@Override
void start() {
System.out.println("悍马H2发动.....");
}
@Override
void stop() {
System.out.println("悍马H2停车.....");
}
@Override
void alarm() {
System.out.println("悍马H2按喇叭.....");
}
@Override
void engineBoom() {
System.out.println("悍马H2的引擎声.....");
}
}
测试类如下:
package com.jack.modelmethod;
/**
* Created by jack on 2017/8/2.
*/
public class Client {
public static void main(String[] args) {
HummerModel hummerModel = new HummerH1Model();
hummerModel.run();
}
}
模板方法模式的优点:
1,封装不变部分,扩展可变部分
2,提取公共部分代码,便于维护
3,行为由负例控制,子类实现
适用场景:
1,多个子类有公有的方法,并且逻辑基本相同时
2,重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节供暖由各个子类实现
3,重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。