英文名稱:Template Method Pattern。
**定義**:定義一個操作中的算法的框架,而將一些步驟延遲到子類中,是的子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
**我的理解**:模板方法模式在編程中常常用到,例如Android開發中創建Activity我們繼承Activity,需要重寫onCreat()方法和其他固定的方法一樣,這就是模板方法模式的應用。他首先要定義一個接口或者類,提供一些方法框架,使用子類去繼承這些類,并實現這些方法,是的該方法的具體實現在子類中提供。
**一個例子:**
一個車輛模型定義它的start(),stop(),alarm(),engineBoom(),run()等方法。
不同的車輛都要遵守這個接口,并實現其特有的方法。
定義一個BMWModel類和BenzModel類來實現這個接口,并提供特有的方法。

~~~
public class TemplateMethodTest {
public static void main(String[] args) {
System.out.println("------奔馳車模板----------");
Model benz = new BenzModel();
benz.run();
System.out.println("------寶馬車模板----------");
Model bmw = new BMWModel();
bmw.run();
}
}
abstract class Model{
//車輛啟動
protected abstract void start();
//車輛停止
protected abstract void stop();
//車輛鳴笛
protected abstract void alarm();
//車輛發動機轟鳴
protected abstract void engineBoom();
protected void run(){
this.engineBoom();
this.start();
this.alarm();
this.stop();
}
}
class BMWModel extends Model{
@Override
protected void start() {
System.out.println("寶馬車啟動...");
}
@Override
protected void stop() {
System.out.println("寶馬車停止...");
}
@Override
protected void alarm() {
System.out.println("寶馬車開始鳴笛...");
}
@Override
protected void engineBoom() {
System.out.println("寶馬車發動機轟鳴...");
}
}
class BenzModel extends Model{
@Override
protected void start() {
System.out.println("奔馳啟動...");
}
@Override
protected void stop() {
System.out.println("奔馳停止...");
}
@Override
protected void alarm() {
System.out.println("奔馳開始鳴笛...");
}
@Override
protected void engineBoom() {
System.out.println("奔馳發動機轟鳴...");
}
}
~~~
**模板方法模式的應用場景:**
1、多個子類有共有的方法,并且邏輯基本相同
2、重要復雜的算法,可以把核心算法設計為模板方法,周邊的相關細節功能則由各個子類實現
3、重構時,模板方法模式是一個經常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子函數約束其行為
**模板方法模式的擴展:
1、鉤子函數約束子類的行為。
案例擴展:**
老板要求讓用戶自己設置汽車的鳴笛時間。
那么就需要定義一個isAlarm方法讓用戶去設置是否鳴笛。從而約束其方法的執行。
~~~
public class TemplateMethodTest {
public static void main(String[] args) {
System.out.println("------奔馳車模板----------");
System.out.println("用戶設置車輛是否鳴笛,1表示可以鳴笛,2表示不可以鳴笛.");
BenzModel benz = new BenzModel();
Scanner input = new Scanner(System.in);
String type = input.next();
if(type.equals("1")){
benz.setAlarm(true);
}else if(type.equals("2")){
benz.setAlarm(false);
}else{
System.out.println("無效的輸入!");
return;
}
benz.run();
}
}
abstract class Model{
//車輛啟動
protected abstract void start();
//車輛停止
protected abstract void stop();
//車輛鳴笛
protected abstract void alarm();
//車輛發動機轟鳴
protected abstract void engineBoom();
protected void run(){
this.engineBoom();
this.start();
//如果isAlarm為true,就執行鳴笛方法。
if(isAlarm())
this.alarm();
this.stop();
}
//用isAlarm設置是否需要鳴笛,默認可以鳴笛。
protected boolean isAlarm(){
return true;
}
}
class BMWModel extends Model{
private boolean flag = true;
public void setAlarm(boolean flag){
this.flag = flag;
}
protected boolean isAlarm() {
return flag;
}
@Override
protected void start() {
System.out.println("寶馬車啟動...");
}
@Override
protected void stop() {
System.out.println("寶馬車停止...");
}
@Override
protected void alarm() {
System.out.println("寶馬車開始鳴笛...");
}
@Override
protected void engineBoom() {
System.out.println("寶馬車發動機轟鳴...");
}
}
class BenzModel extends Model{
private boolean flag = true;
public void setAlarm(boolean flag){
this.flag = flag;
}
protected boolean isAlarm() {
return flag;
}
@Override
protected void start() {
System.out.println("奔馳啟動...");
}
@Override
public void stop() {
System.out.println("奔馳停止...");
}
@Override
public void alarm() {
System.out.println("奔馳開始鳴笛...");
}
@Override
public void engineBoom() {
System.out.println("奔馳發動機轟鳴...");
}
}
~~~
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式