設(shè)計模式《模板方法模式》

引言

??上一節(jié)我們說了抽象工廠模式,今天我們來說說"模板方法模式"。

示例地址

??Demo

依然是先看類圖

image

模板方法模式的定義

??定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使的子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。

使用場景

??1. 多個子類有公有的方法,并且邏輯基本相同時。
??2. 重要、復(fù)雜的算法,可以把核心算法設(shè)計為模板方法,周邊的相關(guān)細(xì)節(jié)功能則有各個子類實現(xiàn)。
??3. 重構(gòu)時,模板方法模式是一個經(jīng)常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子函數(shù)約束其行為。

模板方法模式示例

??每到年底,在北京的外地人都要回家,很多人選擇做火車回家,也有選擇坐飛機(jī)回去的。但是他們都經(jīng)歷同樣的過程。買票、上車(登機(jī))、下車、回家。

1. 首先,我們來寫基類
/**
 * 春節(jié)回家的基類
 *
 * @author 512573717@qq.com
 * @created 2018/7/10  下午3:03.
 */
public abstract class BaseGoHome {

    //選擇出行方式
    public abstract void travelWay();

    //買票
    public abstract void buyTicket();

    //上車
    public abstract void shangche();

    //下車
    public abstract void xiache();
}
2. 看看老王怎么回家的
/**
 * 老王回家
 *
 * @author 512573717@qq.com
 * @created 2018/7/10  下午3:11.
 */
public class LaoWang extends BaseGoHome {
    @Override
    public void travelWay() {
        System.out.println("選擇做火車回家");
    }

    @Override
    public void buyTicket() {
        System.out.println("去火車站買票");
    }

    @Override
    public void shangche() {
        System.out.println("在候車室檢票進(jìn)站");
    }

    @Override
    public void xiache() {
        System.out.println("下車 做公交回家");
    }
}
3. 在看看小明的
/**
 * 小明回家
 *
 * @author 512573717@qq.com
 * @created 2018/7/10  下午3:10.
 */
public class XiaoMing extends BaseGoHome {
    @Override
    public void travelWay() {
        System.out.println("選擇做飛機(jī)回家");
    }

    @Override
    public void buyTicket() {
        System.out.println("在網(wǎng)上買提前訂票");
    }

    @Override
    public void shangche() {
        System.out.println("換登記牌 登機(jī)");
    }

    @Override
    public void xiache() {
        System.out.println("打車回家");
    }
}
4. 具體運(yùn)用
  System.out.println("小明春節(jié)回家");
  BaseGoHome xiaoming = new XiaoMing();
  xiaoming.travelWay();
  xiaoming.buyTicket();
  xiaoming.shangche();
  xiaoming.xiache();

  System.out.println("老王春節(jié)回家");
  BaseGoHome laowang = new XiaoMing();
  laowang.travelWay();
  laowang.buyTicket();
  laowang.shangche();
  laowang.xiache();

總結(jié)

??模板方法模式,我們用的應(yīng)該是比較多的,例如BaseActivity、BaseFragment。Android源碼的Activity是一個典型的模板方法模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容