策略設計模式

簡介

策略模式,又叫算法簇模式,就是定義了不同的算法族,並且之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。

實現

策略設計模式由以下幾個部分組成

  • 封裝類:也叫上下文,對策略進行二次封裝,目的是避免高層模塊對策略的直接調用。
  • 抽象策略:通常情況下爲一個接口,當各個實現類中存在着重複的邏輯時,則使用抽象類來封裝這
    部分公共的代碼,此時,策略模式看上去更像是模版方法模式。
  • 具體策略:具體策略角色通常由一組封裝了算法的類來擔任,這些類之間可以根據需要自由替換。

假設有這樣一個需求

商店購物

  • 青銅會員打九五折
  • 白銀會員打九折
  • 白金會員打八折

  1. 我們先寫抽象策略
public interface Strategy {
    double getPrice(double standardPrice);
}
  1. 三種具體策略
/**
 * 青銅用戶
 * @author guxiang
 * @date 2017-2-23 下午8:09:56
 */
public class BronzeMember implements Strategy {

    public double getPrice(double standardPrice) {
        System.out.println("九五折");
        return standardPrice*0.95;
    }

}
/**
 * 白銀用戶
 * @author guxiang
 * @date 2017-2-23 下午8:10:57
 */
public class SilverMember implements Strategy {

    public double getPrice(double standardPrice) {
        System.out.println("九折");
        return standardPrice*0.9;
    }

}
/**
 * 白金用戶
 * @author guxiang
 * @date 2017-2-23 下午8:10:23
 */
public class PlatinoMember implements Strategy{

    public double getPrice(double standardPrice) {
        System.out.println("八折");
        return standardPrice*0.8;
    }

}
  1. 封裝類(上下文類)
/**
 * context負責具體與策略類的交互
 * 在spring中的依賴注入功能,可以通過配置文件,動態注入策略對象
 * @author guxiang
 * @date 2017-2-23 下午8:53:57
 */
public class Context {
    private Strategy strategy;

    //構造注入
    public Context(Strategy strategy) {
        super();
        this.strategy = strategy;
    }
    //set方法注入
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void getFinallyPrice( double standardPrice) {
        System.out.println("報價是"+strategy.getPrice(standardPrice));
    }
}

策略模式的本質其實就是 分離算法,選擇實現

  • JAVASE中的GUI編程就中的佈局管理器是最常用的策略模式,Flow佈局,Border佈局,Card佈局
  • Spring框架中,Resource接口,實現的資源訪問策略
發佈了43 篇原創文章 · 獲贊 91 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章