設計模式之模板方法模式

定義

定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

Android 中源碼使用模板方法模式

  • AsyncTask
  • Activity 的生命周期

特點

  • 優(yōu)點
    (1)封裝不變部分,擴展可變部分。
    (2)提取公共部分代碼,便于維護。

  • 缺點
    需要為每一個基本方法的不同實現提供一個子類,如果父類中可變的基本方法太多,將會導致類的個數增加,系統(tǒng)更加龐大,設計也更加抽象,此時,可結合橋接模式來進行設計。

使用場景

(1)多個子類有公有的方法,并且邏輯基本相同。
(2)重要、復雜的算法,可以把核心算法設計為模板方法,周邊的相關細節(jié)功能由各個子類實現。
(3)重構時,模板方法是一個經常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子方法約束其行為。

簡單實現

  1. 抽象類
/**
 * Created on 2019/4/12 13:45
 *
 * @author Scarf 
 */
public abstract class Computer {
    protected abstract void powerOn();    //開啟電源

    protected abstract void checkHardware(); //檢查硬件

    protected abstract void loadOS(); //輸入操作系統(tǒng)

    protected abstract void login();   //登錄

    protected boolean isLogin(){
        return true;
    }

    //模板方法
    public final void startUp() {
        Log.d("TAG", "開機 start");
        powerOn();

        checkHardware();

        loadOS();

        if (isLogin()) {
            login();
        }

        Log.d("TAG", "開機 end");
    }

}

-------------------------------------
/**
 * Created on 2019/4/12 13:52
 *
 * @author Scarf
 */
public class WindowComputer extends Computer {
    @Override
    protected void powerOn() {
        Log.d("TAG", "win7 開啟電源");
    }

    @Override
    protected void checkHardware() {
        Log.d("TAG", "win7 檢查硬件");
    }

    @Override
    protected void loadOS() {
        Log.d("TAG", "win7 載入操作系統(tǒng)");
    }

    @Override
    protected void login() {

    }

    @Override
    protected boolean isLogin() {
        return false;
    }
}

----------------------------------------
/**
 * Created on 2019/4/12 13:52
 *
 * @author Scarf
 */
public class MacComputer extends Computer {
    @Override
    protected void powerOn() {
        Log.d("TAG", "mac 開啟電源");
    }

    @Override
    protected void checkHardware() {
        Log.d("TAG", "mac 檢查硬件");
    }

    @Override
    protected void loadOS() {
        Log.d("TAG", "mac 載入操作系統(tǒng)");
    }

    @Override
    protected void login() {
        Log.d("TAG", "mac 登錄");
    }


}
  1. 使用
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
    }

    private void initData() {
        Computer computer = new WindowComputer();
        computer.startUp();

        computer = new MacComputer();
        computer.startUp();

    }
}
  1. 輸出結果:
2019-04-12 13:57:19 D/TAG: 開機 start
2019-04-12 13:57:19 D/TAG: win7 開啟電源
2019-04-12 13:57:19 D/TAG: win7 檢查硬件
2019-04-12 13:57:19 D/TAG: win7 載入操作系統(tǒng)
2019-04-12 13:57:19 D/TAG: 開機 end
2019-04-12 13:57:19 D/TAG: 開機 start
2019-04-12 13:57:19 D/TAG: mac 開啟電源
2019-04-12 13:57:19 D/TAG: mac 檢查硬件
2019-04-12 13:57:19 D/TAG: mac 載入操作系統(tǒng)
2019-04-12 13:57:19 D/TAG: mac 登錄
2019-04-12 13:57:19 D/TAG: 開機 end
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容