Android 設計模式之模板方法模式
來源:程序員人生 發布時間:2014-09-27 04:22:51 閱讀次數:2008次
模板方法模式的定義:在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。
設計原則:別調用我們,我會調用你,(就好比獵頭和求職者,求職者不需要去找獵頭,獵頭只要有工作就會找到你)稱之為好萊塢原則
引用一個例子,一個店中有兩飲料:咖啡和茶,他們的沖泡方法
第一步:都是要用沸水
第二步:用熱水泡咖啡或茶
第三步:把飲料倒進杯子
第四步:在飲料中加入適當的調料
在上面的步驟中一、三是一樣的,可以抽取出來放在基類中,二、四不一樣,可以抽象出來,讓子類去實現,以下是飲料抽象的父類,父類可以讓未知的子類去做它本身可能完成的不好或者根本完成不了的事情;可以加一個鉤子函數:custcomerWantsCondiments(),請子類去重寫。
CoffeineBeverageWithHook.java
package com.dzt.template;
/**
* 由于有的客戶有可能不需要調料,這時就需要讓客戶去選擇是否來添加調料,需要
*
* @author Administrator
*
*/
public abstract class CoffeineBeverageWithHook {
void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (custcomerWantsCondiments())
addCondiments();
}
abstract void brew(); // 沖泡
abstract void addCondiments(); // 添加調料
// 燒開水
void boilWater() {
System.out
.println("CoffeineBeverageWithHook-------------------->boilWater");
}
// 把飲料倒進杯子
void pourInCup() {
System.out
.println("CoffeineBeverageWithHook-------------------->pourInCup");
}
/**
* 子類可以重載這個函數
*
* @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()函數,由用戶決定是否需要添加調料
測試代碼
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();
}
}
總結:
1、模板方法是一種代碼復用的基本技術。它們在類庫中尤為重要,它們提取了類庫中的公共行為。
2、模板方法導致一種方向控制結構,"好萊塢法則":"Don't call me,i will call you.",即一個父類調用子類的操作,而不是相反。
3、模板調用操作的類型有具體的操作,具體的AbstracClass操作,原語操作,工廠方法,鉤子操作。少定義原語操作。
4、模板方法使用繼承來改變算法的一部分。策略模式使用委托來改變整個算法。
相關代碼:http://download.csdn.net/detail/deng0zhaotai/7835511
參考書籍:《Head First 設計模式》
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈