1秉颗、概述
策略模式是一種行為設(shè)計模式痢毒, 它能讓你定義一系列算法, 并將每種算法分別放入獨立的類中蚕甥, 以使算法的對象能夠相互替換哪替。
2、使用場景
1)當你想使用對象中各種不同的算法變體梢灭, 并希望能在運行時切換算法時夷家, 可使用策略模式。
2)當你有許多僅在執(zhí)行某些行為時略有不同的相似類時敏释, 可使用策略模式库快。
3)如果算法在上下文的邏輯中不是特別重要, 使用該模式能將類的業(yè)務(wù)邏輯與其算法實現(xiàn)細節(jié)隔離開來钥顽。
4)當類中使用了復(fù)雜條件運算符以在同一算法的不同變體中切換時义屏, 可使用該模式。實際就是減少邏輯判斷蜂大。
3闽铐、實例
以支付寶、微信支付舉例:
創(chuàng)建一個支付接口:
package com.cloud.bssp.designpatterns.Strategy;
/**
* 支付策略接口
* @date: 2021/1/25
* @author weirx
* @version 3.0
*/
public interface IPayStrategy {
/**
* 支付
*/
void pay();
}
定義其兩個實現(xiàn)類:
/**
* 微信
* @date: 2021/1/25
* @author weirx
* @version 3.0
*/
public class WXPay implements IPayStrategy{
@Override
public void pay() {
System.out.println("使用微信支付");
}
}
/**
* 支付寶
* @date: 2021/1/25
* @author weirx
* @version 3.0
*/
public class ZFBPay implements IPayStrategy{
@Override
public void pay() {
System.out.println("使用支付寶支付");
}
}
測試類奶浦,有客戶端判斷使用那種方式兄墅,在代碼里面需要些邏輯判斷:
/**
* 測試類
* @date: 2021/1/25
* @author weirx
* @version 3.0
*/
public class TestDemo {
public static void main(String[] args) {
IPayStrategy wxPay = new WXPay();
IPayStrategy zfbPay = new ZFBPay();
boolean flag = true;
if (flag) {
wxPay.pay();
} else {
zfbPay.pay();
}
}
}
結(jié)果:
使用微信支付
下面我們看看如何消除客戶端中的if、else:
增加一個枚舉類澳叉,在枚舉類內(nèi)部提供newInstance方法隙咸,根據(jù)傳入code值進行支付方式的初始化。
/**
* 支付策略
* @date: 2021/1/25
* @author weirx
* @version 3.0
*/
public enum PayStrategyEnum {
/**
* weixin
*/
WEIXIN("weixin") {
@Override
public IPayStrategy create() {
return new WXPay();
}
},
/**
* zhifubao
*/
ZHIFUBAO("zhifubao") {
@Override
public IPayStrategy create() {
return new ZFBPay();
}
};
/**
* 根據(jù)枚舉值獲取bean實例
* @param analyseTypeEnum
* @return
*/
public static IPayStrategy newInstance(PayStrategyEnum analyseTypeEnum) {
return analyseTypeEnum.create();
}
public abstract IPayStrategy create();
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
PayStrategyEnum(String code) {
this.code = code;
}
/**
* 根據(jù)code獲取枚舉
* @param code
* @return
*/
public static PayStrategyEnum getEnum(String code) {
for (PayStrategyEnum value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}
}
測試類
/**
* 測試類
* @date: 2021/1/25
* @author weirx
* @version 3.0
*/
public class TestDemo {
public static void main(String[] args) {
IPayStrategy wx = PayStrategyEnum.newInstance(PayStrategyEnum.getEnum("weixin"));
wx.pay();
IPayStrategy zfb = PayStrategyEnum.newInstance(PayStrategyEnum.getEnum("zhifubao"));
zfb.pay();
}
}
結(jié)果:
使用微信支付
使用支付寶支付
4成洗、分析
通過策略模式五督,使我們的代碼非常的簡潔。
客戶端只與支付策略接口和枚舉類有關(guān)系瓶殃,不需要關(guān)心具體的支付方法充包。
利于擴展其他支付方式,而不需要修改原有的代碼遥椿。
使用枚舉方式減少我們代碼中的if基矮、else等的邏輯判斷淆储,增加可讀性。
5愈捅、總結(jié)
優(yōu)點:
1)你可以在運行時切換對象內(nèi)的算法遏考。
2)你可以將算法的實現(xiàn)和使用算法的代碼隔離開來。
3)開閉原則蓝谨。 你無需對上下文進行修改就能夠引入新的策略灌具。
缺點:
1)如果你的算法極少發(fā)生改變, 那么沒有任何理由引入新的類和接口譬巫。 使用該模式只會讓程序過于復(fù)雜咖楣。
2)客戶端必須知曉策略間的不同——它需要選擇合適的策略。