設(shè)計(jì)模式10:模板方法

模板方法(Template Method DP):在一個(gè)方法中定義一個(gè)算法的骨架叠国,而將一些步驟延遲到子類中屯远。子類可以在不改變算法結(jié)構(gòu)的前提下金麸,重新定義算法的某些步驟。
模板方法的實(shí)現(xiàn)是通過鉤子(Hooks)套鹅。什么是鉤子呢?
鉤子是一種被聲明在超類中的方法汰具,只有空的或者默認(rèn)的實(shí)現(xiàn)卓鹿,其存在的意義就是讓子類改寫的。
我想到的最典型的例子:安卓開發(fā)的Activity留荔,各種onCreate,onResume,onDestroy方法都是鉤子吟孙,子類可以很方便地加入自己的東西,因此Activity很明顯采用了模板方法聚蝶。
什么是模板杰妓?超類的算法或者實(shí)現(xiàn)就是模板。實(shí)際生活當(dāng)中我們也用過模板碘勉,模板就是拿過來(lái)改改用的巷挥。全部照抄不叫模板,全部推翻也不叫模板验靡。
這里又可以和策略模式還有工廠方法比較一下倍宾。從概念上來(lái)講其實(shí)差別很明顯雏节,策略模式是對(duì)同一方法的不同實(shí)現(xiàn)的封裝,模板是子類來(lái)決定如何實(shí)現(xiàn)一個(gè)算法或者流程高职,工廠方法是子類決定實(shí)例化具體類矾屯。

代碼:
行竊方法,是一個(gè)模板初厚,留下3個(gè)鉤子函數(shù)件蚕,分別是挑目標(biāo),迷惑目標(biāo)产禾,偷得物品:

/**
 * 
 * StealingMethod defines skeleton for the algorithm.
 * 
 */
public abstract class StealingMethod {

  private static final Logger LOGGER = LoggerFactory.getLogger(StealingMethod.class);

  protected abstract String pickTarget();

  protected abstract void confuseTarget(String target);

  protected abstract void stealTheItem(String target);

  /**
   * Steal
   */
  public void steal() {
    String target = pickTarget();
    LOGGER.info("The target has been chosen as {}.", target);
    confuseTarget(target);
    stealTheItem(target);
  }
}

選擇老弱的哥布林女性排作,Hit&Run方法,搶了就跑:

/**
 * 
 * HitAndRunMethod implementation of {@link StealingMethod}.
 *
 */
public class HitAndRunMethod extends StealingMethod {

  private static final Logger LOGGER = LoggerFactory.getLogger(HitAndRunMethod.class);

  @Override
  protected String pickTarget() {
    return "old goblin woman";
  }

  @Override
  protected void confuseTarget(String target) {
    LOGGER.info("Approach the {} from behind.", target);
  }

  @Override
  protected void stealTheItem(String target) {
    LOGGER.info("Grab the handbag and run away fast!");
  }
}

選擇小商人亚情,哭著跑向目標(biāo)妄痪,擁抱然后掏包:

/**
 * 
 * SubtleMethod implementation of {@link StealingMethod}.
 *
 */
public class SubtleMethod extends StealingMethod {

  private static final Logger LOGGER = LoggerFactory.getLogger(SubtleMethod.class);

  @Override
  protected String pickTarget() {
    return "shop keeper";
  }

  @Override
  protected void confuseTarget(String target) {
    LOGGER.info("Approach the {} with tears running and hug him!", target);
  }

  @Override
  protected void stealTheItem(String target) {
    LOGGER.info("While in close contact grab the {}'s wallet.", target);
  }
}

半成年人盜賊,使用行竊方法模板來(lái)偷東西:

/**
 * 
 * Halfling thief uses {@link StealingMethod} to steal.
 * 
 */
public class HalflingThief {

  private StealingMethod method;

  public HalflingThief(StealingMethod method) {
    this.method = method;
  }

  public void steal() {
    method.steal();
  }

  public void changeMethod(StealingMethod method) {
    this.method = method;
  }
}

測(cè)試:

public static void main(String[] args) {
    HalflingThief thief = new HalflingThief(new HitAndRunMethod());
    thief.steal();
    thief.changeMethod(new SubtleMethod());
    thief.steal();
  }

其實(shí)這里也使用了策略模式楞件,所以可以實(shí)時(shí)切換衫生。模板方法本身是不帶這個(gè)功能的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末土浸,一起剝皮案震驚了整個(gè)濱河市罪针,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黄伊,老刑警劉巖泪酱,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異还最,居然都是意外死亡墓阀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門拓轻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斯撮,“玉大人,你說(shuō)我怎么就攤上這事扶叉∥鸸” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵辜梳,是天一觀的道長(zhǎng)粱甫。 經(jīng)常有香客問我,道長(zhǎng)作瞄,這世上最難降的妖魔是什么茶宵? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮宗挥,結(jié)果婚禮上乌庶,老公的妹妹穿的比我還像新娘种蝶。我一直安慰自己,他們只是感情好瞒大,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布螃征。 她就那樣靜靜地躺著,像睡著了一般透敌。 火紅的嫁衣襯著肌膚如雪盯滚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天酗电,我揣著相機(jī)與錄音魄藕,去河邊找鬼。 笑死撵术,一個(gè)胖子當(dāng)著我的面吹牛背率,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫩与,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寝姿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了划滋?” 一聲冷哼從身側(cè)響起饵筑,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎古毛,沒想到半個(gè)月后翻翩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稻薇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胶征。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞椎。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睛低,靈堂內(nèi)的尸體忽然破棺而出案狠,到底是詐尸還是另有隱情,我是刑警寧澤钱雷,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布骂铁,位于F島的核電站,受9級(jí)特大地震影響罩抗,放射性物質(zhì)發(fā)生泄漏拉庵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一套蒂、第九天 我趴在偏房一處隱蔽的房頂上張望钞支。 院中可真熱鬧茫蛹,春花似錦、人聲如沸烁挟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撼嗓。三九已至柬采,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間且警,已是汗流浹背粉捻。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留振湾,地道東北人杀迹。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像押搪,于是被迫代替她去往敵國(guó)和親树酪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容