定義:定義算法族因惭,分別封裝起來(lái)蒿褂,讓他們之前可以相互替換倦淀,算法的變化獨(dú)立于使用算法的客戶
優(yōu)點(diǎn):策略類之間可以切換蒋畜,由于策略類實(shí)現(xiàn)同一個(gè)抽象,所以他們之間可以自由切換
易于擴(kuò)展,增加一個(gè)新的策略對(duì)策略模式來(lái)說(shuō)非常容易撞叽,基本上可以在不改變?cè)瓉?lái)代碼的基礎(chǔ)上進(jìn)行擴(kuò)展
避免使用多重條件
缺點(diǎn): 維護(hù)各個(gè)策略類會(huì)給開發(fā)帶來(lái)額外開銷
必須對(duì)客戶端(調(diào)用者) 暴露所有的策略類
模式適用場(chǎng)景:
1)許多相關(guān)的類僅僅是行為有異姻成。
2)需要使用一個(gè)算法的不同變體插龄。
3)算法使用客戶不應(yīng)該知道的數(shù)據(jù)。
4)一個(gè)類定義了多種行為 , 并且這些行為在這個(gè)類的操作中以多個(gè)條件語(yǔ)句的形式出現(xiàn)科展。
public interface IPayStrategy{
public void pay();//支付
}
public interface IPayStrategy{
public void pay();//支付
}
public interface IPayStrategy{
public void pay();//支付
}
public interface IPayStrategy{
public void pay();//支付
}
//負(fù)責(zé)調(diào)度均牢,執(zhí)行入口的上下文 context
public class PayStrategyContext {
private IPayStrategy payStrategy;
public PayStrategyContext() {
}
/**
* 執(zhí)行支付
*/
public void excutePay() {
if (null == payStrategy) {
throw new RuntimeException("支付策略未配置");
}
payStrategy.pay();
}
public IPayStrategy getPayStrategy() {
return payStrategy;
}
public void setPayStrategy(IPayStrategy payStrategy) {
this.payStrategy = payStrategy;
}
}
public class MainTest {
public static void main(String[] args) {
//執(zhí)行上下文
PayStrategyContext payStrategyContext = new PayStrategyContext();
IPayStrategy payStrategy = null;
//1.支付寶支付
payStrategy = new AliPayStrategy();
payStrategyContext.setPayStrategy(payStrategy);
payStrategyContext.excutePay();
//2.微信支付
payStrategy = new WexinPayStrategy();
payStrategyContext.setPayStrategy(payStrategy);
payStrategyContext.excutePay();
//3.銀聯(lián)支付
payStrategy = new EBankPayStrategy();
payStrategyContext.setPayStrategy(payStrategy);
payStrategyContext.excutePay();
}
}