編輯:關於Android編程
模板方法模式的定義:在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。
設計原則:別調用我們,我會調用你,(就好比獵頭和求職者,求職者不需要去找獵頭,獵頭只要有工作就會找到你)稱之為好萊塢原則
引用一個例子,一個店中有兩飲料:咖啡和茶,他們的沖泡方法
第一步:都是要用沸水
第二步:用熱水泡咖啡或茶
第三步:把飲料倒進杯子
第四步:在飲料中加入適當的調料
在上面的步驟中一、三是一樣的,可以抽取出來放在基類中,二、四不一樣,可以抽象出來,讓子類去實現,以下是飲料抽象的父類,父類可以讓未知的子類去做它本身可能完成的不好或者根本完成不了的事情;可以加一個鉤子函數: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、模板方法使用繼承來改變算法的一部分。策略模式使用委托來改變整個算法。
問題的闡述:Android SDK中的HttpClient和HttpUrlConnection兩種請求方式用來處理網絡的復雜的操作,但當應用比較復雜的時候需要我們編寫大量
android不同的版本引入的actionbar有差異,現總結如下一、在support.v7包中引入布局使用onCreateOptionsMenu方法中的參數:infla
仿造美圖秀秀移動鼠標調整seekbar,調整圖片的顏色項目布局如下:<LinearLayout xmlns:android=http://schemas.andro
在5.2.1節和5.2.2節介紹了<a>標簽以及TextView自動識別的特殊文本(網址、電話號、Email等),這些都可以通過單擊來觸發不同的動作。雖然這些