Android 策略模式 介面的呼叫
阿新 • • 發佈:2018-11-26
文章目錄
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 原始碼設計模式解析與實戰 第二版
本人鄭重宣告,本部落格所編文章、圖片版權歸權利人持有,本博只做學習交流分享所用,不做任何商業用途。訪問者可將本博提供的內容或服務用於個人學習、研究或欣賞,不得用於商業使用。同時,訪問者應遵守著作權法及其他相關法律的規定,不得侵犯相關權利人的合法權利;如果用於商業用途,須徵得相關權利人的書面授權。若文章、圖片的原作者不願意在此展示內容,請及時通知在下,將及時予以刪除。