模板方法模式,是類的行爲模式,準備一個抽象類,將部分邏輯已具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯;不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現,頂級邏輯的模板方法不可改;
1. 抽象模板角色
/**
* 模板方法模式-抽象模板角色-含有基本方法:抽象方法(必須實現),鉤子方法(可選擇重寫),具體方法(以實現不可改)
*/
@Slf4j
public abstract class AbstractTemplate {
/**
* 頂級邏輯-模板方法
*/
public void installDesk() {
createDeskLeg();
createDeskTop();
doInstallDeskLegAndTop();
checkDesk();
}
/**
* 抽象方法(由子類實現)
*/
protected abstract void createDeskLeg();
/**
* 抽象方法(由子類實現)
*/
protected abstract void createDeskTop();
/**
* 基本方法(鉤子方法-具體模板角色可以重寫)
*/
protected void doInstallDeskLegAndTop() {
log.info("模板方法模式-抽象模板角色-組裝桌腿和桌面");
}
/**
* 具體方法(已經實現)
*/
private void checkDesk() {
log.info("模板方法模式-抽象模板角色-檢查桌子");
}
}
2. 具體模板方法
/**
* 模板方法模式-具體模板角色
*/
@Slf4j
public class ConcreteTemplate extends AbstractTemplate {
/**
* 實現抽象模板角色的抽象方法
*/
@Override
protected void createDeskLeg() {
log.info("模板方法模式-具體模板角色-製造桌腿");
}
/**
* 實現抽象模板角色的抽象方法
*/
@Override
protected void createDeskTop() {
log.info("模板方法模式-具體模板角色-製造桌面");
}
/**
* 重寫抽象模板角色的鉤子方法
*/
@Override
protected void doInstallDeskLegAndTop() {
log.info("模板方法模式-具體模板角色-組裝桌腿和桌面");
}
}
/**
* 模板方法模式-具體模板角色2
*/
@Slf4j
public class ConcreteTemplate2 extends AbstractTemplate {
/**
* 實現抽象模板角色的抽象方法
*/
@Override
protected void createDeskLeg() {
log.info("模板方法模式-具體模板角色2-製造桌腿");
}
/**
* 實現抽象模板角色的抽象方法
*/
@Override
protected void createDeskTop() {
log.info("模板方法模式-具體模板角色2-製造桌面");
}
// 具體模板角色2---不重寫抽象模板角色的鉤子方法
}
3. 測試:
/**
* 模板方法模式-測試
*/
@Slf4j
public class TemplateMethodTest {
@Test
public void test() {
AbstractTemplate template = new ConcreteTemplate();
template.installDesk();
log.info("----------------------------------------------");
template = new ConcreteTemplate2();
template.installDesk();
}
}
4. 測試結果
5. HttpServlet就是經典的模板方法模式,HttpService類提供了service方法作爲頂級邏輯,其內部的七個do方法就是抽象方法交由其子類實現.