模式簡介
策略模式是對算法的包裝,是把使用算法的責任和算法本身分割開來,委派給不同的對象管理。策略模式通常把一個系列的算法包裝到一系列的策略類裏面,作爲一個抽象策略類的子類。用一句話來說,就是:“準備一組算法,並將每一個算法封裝起來,使得它們可以互換”。
UML類圖
策略模式和工廠模式區別
1.從類型上說:簡單工廠模式屬於創建型模式,而策略模式屬於行爲型模式。
2.接下來,看一個小例子:
斧子有很多種,有一個工廠專門負責生產各種需求的斧子。
工廠模式:
1)根據你給出的目的來生產不同用途的斧子,例如要砍人,那麼工廠生產砍人斧子,要伐木就生產伐木斧子。
2)即根據你給出一些屬性來生產不同行爲的一類對象返回給你。
3)關注對象創建
策略模式:
1)用工廠生產的斧子來做對應的事情,例如用砍人的斧子來砍人,用伐木的斧子來伐木。
2)即根據你給出對應的對象來執行對應的方法。
3)關注行爲的選擇
3.簡單工廠模式:根據客戶選擇的條件,來幫客戶創建一個對象。
策略模式:客戶給它一個創建好的對象,它來幫客戶做相應的事。
缺點:
簡單工廠模式的缺點就是當有新的需求增加時,需要頻繁的修改工廠類。只用策略模式,當有新的需求增加時需要修改的是客戶端,客戶端仍然承擔着創建對象的職責,並沒有減輕客戶端的壓力。而將這兩種模式結合起來使用,則需要修改 Context 類,總之不是完美的。
案例:超市收款(正常收款,打折,積分……)
ChargeSuper.java
package main.com.codetears.Straegy.charge;
/**
* @Description 現金收取超類
* @Date 2019-05-13 13:43
* @Author l'amour solitaire
*/
public abstract class ChargeSuper {
public abstract double acceptCash(double money);
}
ChargeNormal.java
package main.com.codetears.Straegy.charge;
/**
* @Description 正常收費子類
* @Date 2019-05-13 13:49
* @Author l'amour solitaire
*/
public class ChargeNormal extends ChargeSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
ChargeRebate.java
package main.com.codetears.Straegy.charge;
/**
* @Description 折扣類
* @Date 2019-05-13 13:59
* @Author l'amour solitaire
*/
public class ChargeRebate extends ChargeSuper {
// 折扣率
public double moneyRebate = 1d;
public ChargeRebate(String rebate) {
moneyRebate = Double.parseDouble(rebate);
}
@Override
public double acceptCash(double money) {
return money * moneyRebate;
}
}
ChargeContext.java
package main.com.codetears.Straegy;
import main.com.codetears.Straegy.charge.ChargeNormal;
import main.com.codetears.Straegy.charge.ChargeRebate;
import main.com.codetears.Straegy.charge.ChargeSuper;
/**
* @Description
* @Date 2019-05-13 14:09
* @Author l'amour solitaire
*/
public class ChargeContext {
public ChargeSuper charge = null;
ChargeContext(String type) {
switch (type) {
case "正常收款":
charge = new ChargeNormal();
break;
case "折扣收款":
charge = new ChargeRebate("0.85");
break;
default:
break;
}
}
public double money(double money){
return charge.acceptCash(money);
}
}
客戶端
package main.com.codetears.Straegy;
/**
* @Description
* @Date 2019-05-13 14:30
* @Author l'amour solitaire
*/
public class Client {
public static void main(String[] args) {
ChargeContext charge = new ChargeContext("折扣收款");
System.out.println(charge.money(1000));
ChargeContext charge1 = new ChargeContext("正常收款");
System.out.println(charge1.money(1000));
}
}
源碼地址:設計模式示例源碼
部分內容引用自互聯網,如涉及侵權請聯繫本人,謝謝!