Java與設計模式 策略模式

2021-09-07 12:38:19 字數 2849 閱讀 5985

在實際開發中,可能會遇到這樣乙個情況,某一功能的實現分為多種演算法,這些演算法能夠認定為策略,在實際操作時選擇不同演算法或策略進行操作得出終於結果。在實際生活中。這些樣例也是舉不勝舉。比如。商場舉行活動,滿100元減10元,滿200元減30元,滿500元減100元等等...這樣每消費一筆,依據這一筆錢消費的多少。計算終於應支付的錢相應著不同的演算法,這些相應的不同計算方法就能夠認定為是不同的策略。

在某東購物時,依據不同的使用者等級,打折力度也是不同的。

策略模式的uml類圖參照下圖:

假如沒有策略模式。實現某東購物計算終於付款的方法如何呢?

package com.strategy.demo;

public class nostrategy

private double getnocardprice(double price)

private double getironcardprice(double price)

private double getgoldcardprice(double price)

private double getprice(double price,int type)else if(type ==ironcarduser)else if(type ==goldcarduser)else

}}

執行例項:

呀,得出正確的答案了,這時你是不是應該滿足了呢。應該高枕無憂了呢?突然,主管說要新增鑽石使用者的類別,鑽石使用者打六折,這時你怎麼實現呢?在裡面在新增鑽石使用者的型別,再新增計算鑽石使用者的方法,再再最後的推斷裡新增i f else?  這種確能夠實現功能,可是是不是不滿足開閉原則呢?並且隨著使用者種類的不斷新增,你的if  else是不是也越來越長,邏輯也越來越複雜呢?導致系統擴充套件性和穩定性越來越差呢? 所以,這種方式在實際中顯然實不可取的,以下我們看一下怎樣使用策略模式來實現上面的需求。

1.pricestrategyinte***ce 介面,相應uml類圖中的strategy介面:

package com.strategy.demo;

public inte***ce pricestrategyinte***ce

2.實現類,無卡使用者:

package com.strategy.demo;

public class nocarduserstrategy implements pricestrategyinte***ce

}

3.實現類。鐵卡使用者:

package com.strategy.demo;

public class ironcarduserstrategy implements pricestrategyinte***ce

}

4.實現類。金卡使用者:

package com.strategy.demo;

public class goldcarduserstrategy implements pricestrategyinte***ce

}

5.環境物件。用來操作策略:

package com.strategy.demo;

public class pricecontext

/* * 通過物件計算返回值

*/public double getprice(double price)

}

環境物件初始化時。將相應的策略物件傳入,然後呼叫方法返回計算值。

6.構建測試類,測試:

package com.strategy.demo;

public class testclass

}

執行上面的例項:

得到了和第乙個方法一樣的正確答案,這時我們假如要新增乙個鑽石買家的種類。怎麼實現呢?我們僅僅須要新增乙個策略實現類:

package com.strategy.demo;

public class diamonduserstrategy implements pricestrategyinte***ce

}

然後測試類新增一條鑽石類買家的購物:

package com.strategy.demo;

public class testclass

}

執行例項:

是不是擴充套件起來特別easy?條理也十分清晰。總結一下策略模式的長處:

1. 結構清晰,使用簡單直觀。

2. 系統耦合性減少。擴充套件方便;

3. 操作封裝徹底。資料更為安全。(在testclass中,僅僅知道相關實現類,並不涉及詳細計算方法)

當然,策略方式也存在一定的缺點:

由圖能夠直觀的看出,隨著策略的不斷新增。子類數量變得龐大。

java設計模式與策略模式

策略模式用於封裝系列的演算法,這些演算法通常被封裝在乙個被稱為 context 類中,客戶端程式可以自由選擇其中一種演算法,或讓 context 為客戶端選擇乙個最佳的演算法 使用策略模式的優勢是為了支援演算法的自由切換。1 策略模式提供了管理相關的演算法族的辦法。策略類的等級結構定義了乙個演算法或...

java 設計模式 策略模式

就是比較兩個類別時,要自己寫乙個比較器,這個比較器實現了 comparator介面,裡面實現public int compare object o1,object o2 方法。在實體類裡面要有乙個成員變數時這個比較器,這個實體類也要實現了 comparable介面。例如 cat有兩個屬性,heigh...

java設計模式 策略模式

策略模式 strategy pattern 體現了兩個非常基本的物件導向設計的原則 1 封裝變化的概念 2 程式設計中使用介面,而不是對介面的實現。策略模式定義了乙個共同的抽象演算法介面,其子類實現這個介面定義的方法,並且都有各自不同的實現,這些演算法實現可以在客戶端呼叫它們的時候互不影響的變化。子...