策略模式
参考博文
http://baijiahao.baidu.com/s?id=1601547440739500969&wfr=spider&for=pc
概念
其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而使它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
特点
- 封装变化的概念。
- 编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。
比如说我们要实现对一个数组的元素排序,但是到底是要升序还是降序,这个完全由我们来去控制。我们可以把排序的方式全部封装起来去实现同一个接口,传给替我们执行策略的类
代码
现在有个场景:客户下订单,需要采用多种支付方式。(这里仅做简单逻辑)
-
顶层策略接口Payment
package com.pmz.strategy; public interface Payment { void pay(int id,double account); }
支付方式对外提供的统一接口
-
支付宝支付AliPay实现顶层策略接口Payment
package com.pmz.strategy; public class AliPay implements Payment { @Override public void pay(int id, double account) { System.out.println("id为"+id+"的用户,使用支付宝支付了"+account+"元"); } }
具体的支付方式
-
微信支付WeChatPay实现顶层策略接口Payment
package com.pmz.strategy; public class WechatPay implements Payment { @Override public void pay(int id, double account) { System.out.println("id为"+id+"的用户,使用微信支付了"+account+"元"); } }
具体的支付方式
-
订单类 Order
package com.pmz.strategy; public class Order { //将支付方式的接口作为显示引用 private Payment payment; public Order(Payment payment){ this.payment = payment; } //执行策略 public void confirmOrder(int id,double account){ payment.pay(id,account); } }
执行策略
-
测试类 PaymentStrategyTest
package com.pmz.strategy; public class PaymentStrategyTest { public static void main(String[] args) { //给策略执行类传入相应的策略实现 Order order = new Order(new WechatPay()); //传入参数,执行策略 order.confirmOrder(1,100.86); } }
-
输出
id为1的用户,使用微信支付了100.86元
优缺点
优点:
策略模式符合开闭原则。
避免使用多重条件转移语句,如 if...else...语句、switch 语句
使用策略模式可以提高算法的保密性和安全性。
缺点:
客户端必须知道所有的策略,并且自行决定使用哪一个策略类。
代码中会产生非常多策略类,增加维护难度。