咱们以一个例子来讲明策略模式: 在咱们的项目中有个需求:用户提交完订单须要进行支付的时候能够选择不一样的支付方式,支付方式有三种:支付宝、微信和银联。<br> 一般的实现方式是使用if...else语句进行实现:<br>算法
if ( payType.equals("支付宝") ){ // 调用支付宝支付的算法... } else if ( payType.equals("微信") ){ //调用微信的支付算法... } else if (payType.equals("银联") ){ //调用银联支付算法... }
以上的实现思路极不推荐,它的缺点也很是的明显,对支付方式的选择严重耦合在了代码中,对后期的维护和扩展极不方便,假如咱们后期对需求进行叠加,须要添加苹果支付,那就须要在代码中再添加苹果支付的判断。是否是有一种要疯的感受.....<br> 下面就可使用策略模式来实现上述需求:微信
首先咱们定义一个支付的抽象接口:app
public interface PayStragety { void pay(String no); }
而后定义一组支付的算法,实现了该抽象接口:ide
//支付宝支付算法 public class Alipay implements PayStragety { @Override public void pay(String no) { System.out.println("帐号:"+no+"使用支付宝进行支付"); } } //微信支付算法 public class WeixinPay implements PayStragety{ @Override public void pay(String no) { System.out.println("帐号:"+no+"使用微信支付"); } } //银联支付算法 public class YinlianPay implements PayStragety{ @Override public void pay(String no) { System.out.println("帐号:"+no+"使用银联支付"); } }
以上是对一系列支付算法的封装,下面咱们来使用组合的方式来对算法进行调用<br> 建立算法持有的类:测试
public class User { // 策略接口 private PayStragety payStragety; public void setPayStragety(PayStragety payStragety) { this.payStragety = payStragety; } public void executePay(String no) { payStragety.pay(no); } }
用户中有进行支付的方法,经过持有支付策略接口的引用,在进行支付的时候执行策略接口中的支付方法,对于不一样的支付接口实现调用不一样的支付方法(很是巧妙的设计,组合方式和多态的使用,易于扩展)<br>微信支付
下面咱们来测试一下:<br>this
public static void main(String[] args) { User u1 = new User(); u1.setPayStragety(new Alipay()); u1.executePay("328239232"); User u2 = new User(); u2.setPayStragety(new WeixinPay()); u2.executePay("328239233"); User u3 = new User(); u3.setPayStragety(new YinlianPay()); u3.executePay("328239234"); }
执行结果:<br>设计
帐号:328239232使用支付宝进行支付 帐号:328239233使用微信支付 帐号:328239234使用银联支付
因而可知,传入不一样的策略类,实现了对不一样支付方式的调用,实现了咱们的需求<br> 假如咱们需求对其进行扩展,添加ApplePay的方式,那咱们只须要定义ApplePay的支付策略类,实现支付策略接口,在调用的时候传入ApplePay支付对象就能够了,不须要再进行改源码了。<br> 建立ApplePay支付策略:<br>code
public class ApplePay implements PayStragety{ @Override public void pay(String no) { System.out.println("The number:"+ no+"use the apple Pay"); } }
调用Apple支付策略:<br>对象
User appleUser = new User(); appleUser.setPayStragety(new ApplePay()); appleUser.executePay("88833434");
执行结果:<br>
The number:88833434use the apple Pay
到此为止,策略模式的简单实现已经完成,下面我来看一下策略模式的优缺点:<br> 优势:
不一样的策略类实现了共同的接口,能够进行自由的切换。
易于扩展,能够在不修改源码的基础上进行扩展。
避免了使用多重if...else条件的判断,减小了代码的复杂性。<br> 缺点:
要维护多种策略类,增长了系统的开销。
对于客户端的调用,必须暴露全部的策略类,客户端必须了解全部策略类以及策略类之间的区别。