什麼是模板方法模式算法
所謂模板方法模式,就是定義一個操做中的算法的框架,而將一些步驟延遲到子類中,使得子類能夠不改變一個算法的結構便可從新定義該算法的某些特定步驟。框架
模板方法模式的實現方式ide
模板方法模式實際上時封裝了一個固定流(tao)程(lu),第一步作什麼,第二步作什麼都已經在抽象類中定義好,子類只須要在框架不被修改的狀況下實現某些步驟的算法替換。函數
當代小說網站的男頻爽文,都是有必定套路的,開篇都是一個loser,而後意外得到祕笈,接下來修仙,最後成爲宇宙霸主。我相信epubit的讀者是不會讀這些給識字很少的人讀的書的,所以我要拿《紅樓夢》中的「掰謊記」舉例,賈母對某一類文學做品的套路的總結:網站
public abstract class Template {
abstract String getTemplateName();
abstract boolean isChancellor();
abstract String getHeroineName();
abstract String getHeroName();
// 開口都是書香門第 protected void scholarlyFamily(){ Log.e(getTemplateName()," 書香門第"); }
// 父親不是尚書就是宰相 protected void father(){ Log.e(getTemplateName()," 父親是"+(isChancellor()?"宰相":"尚書")); };
// 生一個×××必是愛如珍寶 protected void daughter(){ Log.e(getTemplateName()," 生一個×××("+getHeroineName()+")愛如珍寶"); }
// 這×××必是通文知禮,無所不曉,竟是個絕代佳人 protected void marvelOfBeauty(){ Log.e(getTemplateName()," "+getHeroineName()+"通文知禮,無所不曉,竟是個絕代佳人"); }
// 只一見了一個清俊的男人,無論是親是友,便想起終身大事來 protected void marriage(){ Log.e(getTemplateName()," 一見了一個清俊的男人("+getHeroName()+")便想起終身大事來"); }
// 父母也忘了,書禮也忘了,鬼不成鬼,賊不成賊 protected void forget(){ Log.e(getTemplateName()," "+getHeroineName()+"父母也忘了,書禮也忘了,鬼不成鬼,賊不成賊"); }
/** * 這個模(tao)板(lu)必須final */ public final void play(){ scholarlyFamily(); father(); daughter(); marvelOfBeauty(); marriage(); forget(); }
}spa |
被賈母掰謊的做品《鳳求凰》:設計
public class Courtship extends Template{
@Override String getTemplateName() { return "《鳳求凰》"; }
@Override boolean isChancellor() { return false; }
@Override String getHeroineName() { return "李雛鸞"; }
@Override String getHeroName() { return "王熙鳳"; }
/** * 女主角父親既不是尚書也不是宰相 */ protected void father(){ Log.e(getTemplateName(),"這莊上有個鄉紳,姓李"); } }生命週期 |
相似的做品《西廂記》:ip
public class WesternChamber extends Template{ @Override String getTemplateName() { return "《西廂記》"; }
@Override boolean isChancellor() { return true; }
@Override String getHeroineName() { return "崔鶯鶯"; }
@Override String getHeroName() { return "張君瑞"; } }開發 |
賈母過了一個開心的元宵節,讀者們也學會了模板方法模式。
Android源碼中的模板方法模式
(1)AsyncTask
用戶能夠根據需求重寫onPreExecute、doInBackground、onPostExecute這個邏輯流程,這是典型的模板方法模式。
(2)生命週期
不管Activity、Service仍是Fragment,一切以「on」打頭的被動方法都是模板方法模式的一部分。
Android開發中如何利用模板方法模式
模板方法模式的優勢很明顯:
(1)封裝不變部分,擴展可變部分
(2)提取公共部分代碼,便於維護。
所以適用於如下場合:
(1)多個子類有公有的方法,而且邏輯基本相同時。
(2)重複、複雜的算法,能夠把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現。
(3)重構時,把相同的代碼抽取到父類中,而後經過鉤子函數約束其行爲。
須要注意的幾個問題
模板方法模式會帶來代碼閱讀的難度。