Android 設(shè)計(jì)模式之模板方法模式
來源:程序員人生 發(fā)布時(shí)間:2014-09-27 04:22:51 閱讀次數(shù):2003次
模板方法模式的定義:在一個(gè)方法中定義一個(gè)算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法中的某些步驟。
設(shè)計(jì)原則:別調(diào)用我們,我會(huì)調(diào)用你,(就好比獵頭和求職者,求職者不需要去找獵頭,獵頭只要有工作就會(huì)找到你)稱之為好萊塢原則
引用一個(gè)例子,一個(gè)店中有兩飲料:咖啡和茶,他們的沖泡方法
第一步:都是要用沸水
第二步:用熱水泡咖啡或茶
第三步:把飲料倒進(jìn)杯子
第四步:在飲料中加入適當(dāng)?shù)恼{(diào)料
在上面的步驟中一、三是一樣的,可以抽取出來放在基類中,二、四不一樣,可以抽象出來,讓子類去實(shí)現(xiàn),以下是飲料抽象的父類,父類可以讓未知的子類去做它本身可能完成的不好或者根本完成不了的事情;可以加一個(gè)鉤子函數(shù):custcomerWantsCondiments(),請(qǐng)子類去重寫。
CoffeineBeverageWithHook.java
package com.dzt.template;
/**
* 由于有的客戶有可能不需要調(diào)料,這時(shí)就需要讓客戶去選擇是否來添加調(diào)料,需要
*
* @author Administrator
*
*/
public abstract class CoffeineBeverageWithHook {
void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (custcomerWantsCondiments())
addCondiments();
}
abstract void brew(); // 沖泡
abstract void addCondiments(); // 添加調(diào)料
// 燒開水
void boilWater() {
System.out
.println("CoffeineBeverageWithHook-------------------->boilWater");
}
// 把飲料倒進(jìn)杯子
void pourInCup() {
System.out
.println("CoffeineBeverageWithHook-------------------->pourInCup");
}
/**
* 子類可以重載這個(gè)函數(shù)
*
* @return
*/
boolean custcomerWantsCondiments() {
return true;
}
}
以下是咖啡類,繼承了上面的飲料父類
CoffeineWithHook.java
package com.dzt.template;
public class CoffeineWithHook extends CoffeineBeverageWithHook {
@Override
void brew() {
// TODO Auto-generated method stub
System.out.println("CoffeineWithHook-------------------->brew");
}
@Override
void addCondiments() {
// TODO Auto-generated method stub
System.out
.println("CoffeineWithHook-------------------->addCondiments");
}
@Override
boolean custcomerWantsCondiments() {
// TODO Auto-generated method stub
return false;
}
}
以下是茶類,繼承了上面的飲料父類
TeaWithHook.java
package com.dzt.template;
public class TeaWithHook extends CoffeineBeverageWithHook {
@Override
void brew() {
// TODO Auto-generated method stub
System.out.println("TeaWithHook-------------------->brew");
}
@Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println("TeaWithHook-------------------->addCondiments");
}
@Override
boolean custcomerWantsCondiments() {
// TODO Auto-generated method stub
return true;
}
}
以上代碼可以去修改custcomerWantsCondiments()函數(shù),由用戶決定是否需要添加調(diào)料
測(cè)試代碼
package com.dzt.template;
/**
* 模板方法模式 在模板方法中添加鉤子方法,讓用戶決定
*
* @author Administrator
* @date 2014.08.20
*/
public class TemplateMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CoffeineWithHook coffHook = new CoffeineWithHook();
TeaWithHook teaHook = new TeaWithHook();
coffHook.prepareRecipe();
System.out
.println("---------------------------------------------------------------");
teaHook.prepareRecipe();
}
}
總結(jié):
1、模板方法是一種代碼復(fù)用的基本技術(shù)。它們?cè)陬悗熘杏葹橹匾鼈兲崛×祟悗熘械墓残袨椤?br>
2、模板方法導(dǎo)致一種方向控制結(jié)構(gòu),"好萊塢法則":"Don't call me,i will call you.",即一個(gè)父類調(diào)用子類的操作,而不是相反。
3、模板調(diào)用操作的類型有具體的操作,具體的AbstracClass操作,原語操作,工廠方法,鉤子操作。少定義原語操作。
4、模板方法使用繼承來改變算法的一部分。策略模式使用委托來改變整個(gè)算法。
相關(guān)代碼:http://download.csdn.net/detail/deng0zhaotai/7835511
參考書籍:《Head First 設(shè)計(jì)模式》
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)