定義了算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立於使用此算法的客戶。
類型:
行為型設計模式
適用場景:
比如電商平臺的一些常見活動(促銷、滿減、立減、返現等)。
我們還可以這樣理解,在一個系統中有很多類,其區別在於行為不同,策略模式可以讓某個對象動態的選擇某個行為(也就是某個策略)
策略還可以理解為運算符的+ - * / ,旅行時所要乘坐的交通工具,穿衣時所要選擇的衣服...等等等
優點
符合開閉原則
減少if..else等選擇結構語句
缺點
客戶必須知道所有的策略類,並選擇要使用的策略
產生許多策略類
代碼實現
定義Payment.java接口文件
<code>public interface Payment {
public void pay();
}/<code>
創建具體支付策略並實現Payment接口
Alipay.java策略
<code>public class Bankcard implements Payment {
@Override public void pay() {
System.out.println("使用銀行卡付款"); }
}/<code>
Bankcard.java策略
<code>public class Bankcard implements Payment {
@Override public void pay() {
System.out.println("使用銀行卡付款");
}
}/<code>
Wechatpay.java策略
<code>public class Wechatpay implements Payment {
@Override public void pay() {
System.out.println("使用微信支付");
}
}/<code>
創建PaymentSystem.java類封裝具體策略
<code>public class PaymentSystem {
private Payment payment;
public PaymentSystem(Payment payment) {
this.payment = payment;
}
public void execute(){
payment.pay();
}
}/<code>
Client.java類 客戶調用
<code>public class Client {
public static void main(String[] args) {
PaymentSystem paymentSystem=null;
String paymentType="alipay";
if("alipay".equalsIgnoreCase(paymentType)){
paymentSystem=new PaymentSystem(new Alipay());
}else if("bankcard".equalsIgnoreCase(paymentType)){
paymentSystem=new PaymentSystem(new Bankcard());
}else if("wechatpay".equalsIgnoreCase(paymentType)){
paymentSystem=new PaymentSystem(new Wechatpay());
}
paymentSystem.execute();
}
}/<code>
Client類中使用paymentType變量模擬具體配置,然後通過if..else來實現具體的策略
UML類圖
![《設計模式》之策略模式](http://p2.ttnews.xyz/loading.gif)
![《設計模式》之策略模式](http://p2.ttnews.xyz/loading.gif)
閱讀更多 狂熱知識分子 的文章