模板方法模式
- 父類(lèi)抽象出子類(lèi)共有的方法访娶,并且自己實(shí)現(xiàn)他
- 子類(lèi)實(shí)現(xiàn)各自不同的業(yè)務(wù)
- 父類(lèi)實(shí)現(xiàn)的方法按照一定的邏輯調(diào)用抽象方法
- 為了反之子類(lèi)重寫(xiě)父類(lèi)實(shí)現(xiàn)的方法父類(lèi)定義為final方法
以上就是一個(gè)基本的模板方法崖疤。存在一個(gè)問(wèn)題,父類(lèi)按順序調(diào)用的過(guò)程無(wú)法定制劫哼。也就是所有的子類(lèi)都是按照固定的順序執(zhí)行自己的方法割笙。所以需要鉤子方法來(lái)動(dòng)態(tài)的改變父類(lèi)執(zhí)行方法的流程
- 在父類(lèi)中增加一個(gè)鉤子方法眯亦,提供默認(rèn)的實(shí)現(xiàn)
- 在父類(lèi)中final方法可以判斷一下這個(gè)鉤子方法的邏輯般码,最終決定是否需要改變方法的順序
- 子類(lèi)可以重寫(xiě)鉤子方法,進(jìn)而達(dá)到動(dòng)態(tài)改變父類(lèi)執(zhí)行方法的順序
模板方法是一個(gè)很簡(jiǎn)單的設(shè)計(jì)模式,通過(guò)下面簡(jiǎn)單的實(shí)例來(lái)說(shuō)明模板方法模式
package com.pattern.template;
/**
* @Author: chao.zhu
* @description:
* @CreateDate: 2018/11/20
* @Version: 1.0
*/
public abstract class AbstractCar {
private boolean didiFlag = true;
protected abstract void star();
protected abstract void didi();
protected abstract void shaChe();
protected abstract void stop();
public final void run(){
//按照固定順序執(zhí)行
this.star();
//判斷是否設(shè)置了鉤子屬性
if(didiFlag){
this.didi();
}
this.shaChe();
this.stop();
}
//鉤子方法宫静,子類(lèi)可以設(shè)置屬性動(dòng)態(tài)的改變父類(lèi)執(zhí)行的順序
public void isDiDi(boolean didi){
didiFlag = didi;
}
}
抽象的父類(lèi)實(shí)現(xiàn)類(lèi)run方法券时,run方法的邏輯是固定的按照已經(jīng)設(shè)置好的順序執(zhí)行,并且提供了一個(gè)鉤子方法捌袜,讓子類(lèi)來(lái)操作是否需要嘀嘀作響的聲音
package com.pattern.template;
/**
* @Author: chao.zhu
* @description:
* @CreateDate: 2018/11/20
* @Version: 1.0
*/
public class BMWCar extends AbstractCar {
@Override
protected void star() {
System.out.println("寶馬一鍵啟動(dòng)");
}
@Override
protected void didi() {
System.out.println("遇上碰瓷的炸枣,按喇叭");
}
@Override
protected void shaChe() {
System.out.println("試試剎車(chē)");
}
@Override
protected void stop() {
System.out.println("到達(dá)目的地,熄火");
}
}
實(shí)現(xiàn)了一個(gè)寶馬的小汽車(chē)抛虏,具體如何啟動(dòng),如何響都由自己決定
package com.pattern.template;
/**
* @Author: chao.zhu
* @description:
* @CreateDate: 2018/11/20
* @Version: 1.0
*/
public class BenchiCar extends AbstractCar {
@Override
protected void star() {
System.out.println("奔馳一鍵啟動(dòng)");
}
@Override
protected void didi() {
System.out.println("開(kāi)車(chē)?yán)染晚?);
}
@Override
protected void shaChe() {
System.out.println("剎車(chē)很靈");
}
@Override
protected void stop() {
System.out.println("到達(dá)目的地慕淡,熄火");
}
}
實(shí)現(xiàn)奔馳汽車(chē)沸毁,同樣的可以自己決定自己的啟動(dòng),響聲
package com.pattern.template;
/**
* @Author: chao.zhu
* @description:
* @CreateDate: 2018/11/20
* @Version: 1.0
*/
public class Client {
public static void main(String[] args) {
AbstractCar bmw = new BMWCar();
bmw.run();
AbstractCar benchi = new BenchiCar();
//調(diào)用鉤子方法改變r(jià)un執(zhí)行的順序
benchi.isDiDi(false);
benchi.run();
}
}
可以通過(guò)鉤子方法改變父類(lèi)執(zhí)行方法的順序