什麼是模板方法模式
所謂模板方法模式,就是定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重新定義該算法的某些特定步驟。
模板方法模式的實現方式
模板方法模式實際上時封裝了一個固定流(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(); }
} |
被賈母掰謊的作品《鳳求凰》:
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(),"這莊上有個鄉紳,姓李"); } } |
類似的作品《西廂記》:
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)重構時,把相同的代碼抽取到父類中,然後通過鉤子函數約束其行爲。
需要注意的幾個問題
模板方法模式會帶來代碼閱讀的難度。