編輯:關於android開發
通常如果一個問題有多個解決方案時,最簡單的就是利用if-else或者switch-case方式根據不同的情景選擇不同的解決方案,但是這樣耦合性太高 、代碼臃腫、難以維護等。這時就可以使用策略模式來解決。
策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使他們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。
1.針對同一類型問題的多種處理方式,僅僅是具體行為有差別時。
2.需要安全地封裝多種同一類型的操作時。
3.出現同一抽象類有多個子類,而又需要使用if-else或者switch-case來選擇具體子類時。
需求:計算圖書價格,初級會員沒有折扣,中級會員打9折,高級會員打8折。如果一般寫法,應該是if-else判斷他是什麼級別的會員,在計算相應的折扣。下面使用策略模式來進行實現。
抽象折扣類
public interface MemberStrategy {
/**
* 計算圖書的價格
* @param booksPrice 圖書的原價
* @return 計算出打折後的價格
*/
public double calcPrice(double booksPrice);
}
初級會員折扣類
public class PrimaryMemberStrategy implements MemberStrategy{
/**
* 初級會員折扣
*/
@Override
public double calcPrice(double booksPrice) {
System.out.println("對於初級會員的沒有折扣");
return booksPrice;
}
}
中級會員折扣類
public class IntermediateMemberStrategy implements MemberStrategy{
/**
* 中級會員折扣
*/
@Override
public double calcPrice(double booksPrice) {
System.out.println("對於中級會員的折扣為10%");
return booksPrice * 0.9;
}
}
高級會員折扣類
public class AdvancedMemberStrategy implements MemberStrategy{
/**
* 高級會員折扣
*/
@Override
public double calcPrice(double booksPrice) {
System.out.println("對於高級會員的折扣為20%");
return booksPrice * 0.8;
}
}
價格類
public class Price {
//持有一個具體的策略對象
private MemberStrategy strategy;
/**
* 構造函數,傳入一個具體的策略對象
* @param strategy 具體的策略對象
*/
public Price(MemberStrategy strategy){
this.strategy = strategy;
}
/**
* 計算圖書的價格
* @param booksPrice 圖書的原價
* @return 計算出打折後的價格
*/
public double quote(double booksPrice){
return this.strategy.calcPrice(booksPrice);
}
}
客戶端
public class Client {
public static void main(String[] args) {
//選擇並創建需要使用的策略對象
MemberStrategy strategy1 = new AdvancedMemberStrategy();
//創建環境
Price price = new Price(strategy1);
//計算價格
double quote = price.quote(300);
System.out.println("圖書的最終價格為:" + quote);
}
}
結果
對於高級會員的折扣為20%
圖書的最終價格為:240.0
LinearInterpolator、AccelerateInterpolator、CycleInterpolator等實現Interpolator,通過getInterpolator(float input)獲取當前的時間百分比,以此來計算動畫的屬性值。
策略模式主要用來分離算法,在相同的行為抽象下有不同的具體實現策略。這個模式很好地演示了開閉原則,也就是定義抽象,注入不同的實現,從而達到很好的可擴展性。
1.結構清晰明了、使用簡單直觀。
2.耦合度相對而言較低,擴展方便。
3.操作封裝也更為徹底,數據更為安全。
1.隨著策略的增加,子類也會變得繁多。
為什麼 Android Studio 工程文件夾占用空間這麼大?我們來給它減減肥,androidstudio偶然中發現Android Studio的工程文件夾比ADT B
Android實現不重復啟動APP的方法,androidapp轉載博客:http://blog.sina.cn/dpool/blog/s/blog_5de73d0b010
redis master-slave 切換演練redis master-slave 切換演練環境IP地址端口屬性192.168.31.2086379master192.1
Android中AsyncTask的使用詳解 在Android中我們可以通過Thread+Handler實現多線程通信,一種經典的使用場景是:在新線程中進行耗時操作,