1. 程式人生 > >Android 策略模式 介面的呼叫

Android 策略模式 介面的呼叫

文章目錄

1、策略模式介紹

1)實現某一功能可能會有不同的演算法,不同的策略。我們根據不同的實際情況,選擇不同的策略。
2)策略模式定義了一系列的演算法,並將每個演算法封裝起來,並且他們還都可以相互替換。

2、使用場景

1)針對同一型別問題的多種處理方式,僅僅是具體行為的差別。
2)需要安全的封裝多種同意型別的操作
3)在需要使用 if else switch case 的地方

3、UML 類圖

在這裡插入圖片描述

4、策略模式的簡單實現

舉個示例 :
以建立公交車 和 地鐵 收費系統為例。
如果使用 if-else switch-case 在程式碼裡進行 判斷,會導致 很大的冗餘,並且 以後新增、修改都是比較麻煩的。
我們可以把每種演算法獨立成一個函式,然後外部呼叫對應的方式即可。

1)檔案結構

在這裡插入圖片描述
(1)CalculateStrategy 介面檔案 定義了介面的型別
(2)BusStrategy 汽車的收費的方式
(3)SubwayStrategy 地鐵的收費方式
(4)MainActivity 呼叫不同收費的地方

2)CalculateStrategy 介面檔案
package com.example.ubuntu.mycalculatestragegy;

public interface CalculateStrategy  {

    int calculatePrice(int km) ;
}

3)BusStrategy 公交收費策略
package com.example.ubuntu.mycalculatestragegy;


//公交車計算價格的策略
public class BusStrategy implements CalculateStrategy {

    private String TAG = "BusStrategy: ";
    //假設十公里以內1 元,超過十公里 每加億元乘坐 5 公里
    @Override
    public int calculatePrice(int km) {
        int extraTotal = km - 10;  //超過十公里的總距離
        int extraFactor = extraTotal / 5;  //超出的距離是 5的 幾倍
        int fraction = extraFactor % 5;  //超過的距離對 5 公里取餘

        int price = 1 + extraFactor * 1;   //價格計算
        System.out.println(TAG + "汽車 價格");
        return  fraction > 0 ? ++price : price;
    }
}

4)地鐵收費策略
package com.example.ubuntu.mycalculatestragegy;

public class SubwayStrategy implements CalculateStrategy {

    private String TAG = "SubwayStrategy: ";

    //地鐵價格計算策略
    /*
    * 6Km 內  3 元
    * 6~12km  4 元
    * 12~22km 5 元
    * 22~32Km 6 元
    * */
    @Override
    public int calculatePrice(int km) {
        System.out.println(TAG + "地鐵 價格");
        if (0 < km && km <= 6) {
            return 3;
        } else if (km > 6 && km < 12) {
            return 4;
        } else if (km > 12 && km < 22){
            return  5;
        } else  if(km > 22 && km < 32){
            return 6;
        } else {
            return 7;
        }

    }

}



5)MainActivity 呼叫不同 收費策略
package com.example.ubuntu.mycalculatestragegy;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends Activity {

    private String TAG = "MainActivity: ";

    private CalculateStrategy calculateStrategy;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        calculateStrategy = (CalculateStrategy) new BusStrategy();
       System.out.println(TAG + "car price:" +  calculateStrategy.calculatePrice(20));


        calculateStrategy = (CalculateStrategy) new SubwayStrategy();
        calculateStrategy.calculatePrice(20);
        System.out.println(TAG + "subway  price:" +  calculateStrategy.calculatePrice(20));
    }
}

6) log列印

傳入相同引數 但是 顯示價格卻是不一樣的。

在這裡插入圖片描述

文獻參考:
Android 原始碼設計模式解析與實戰 第二版

本人鄭重宣告,本部落格所編文章、圖片版權歸權利人持有,本博只做學習交流分享所用,不做任何商業用途。訪問者可將本博提供的內容或服務用於個人學習、研究或欣賞,不得用於商業使用。同時,訪問者應遵守著作權法及其他相關法律的規定,不得侵犯相關權利人的合法權利;如果用於商業用途,須徵得相關權利人的書面授權。若文章、圖片的原作者不願意在此展示內容,請及時通知在下,將及時予以刪除。