設計模式-策略模式

模式簡介

策略模式是對算法的包裝,是把使用算法的責任和算法本身分割開來,委派給不同的對象管理。策略模式通常把一個系列的算法包裝到一系列的策略類裏面,作爲一個抽象策略類的子類。用一句話來說,就是:“準備一組算法,並將每一個算法封裝起來,使得它們可以互換”。

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));
    }
}

源碼地址:設計模式示例源碼

部分內容引用自互聯網,如涉及侵權請聯繫本人,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章