设计模式探索之策略模式

咱们以一个例子来讲明策略模式: 在咱们的项目中有个需求:用户提交完订单须要进行支付的时候能够选择不一样的支付方式,支付方式有三种:支付宝、微信和银联。<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> 优势:

  1. 不一样的策略类实现了共同的接口,能够进行自由的切换。

  2. 易于扩展,能够在不修改源码的基础上进行扩展。

  3. 避免了使用多重if...else条件的判断,减小了代码的复杂性。<br> 缺点:

  4. 要维护多种策略类,增长了系统的开销。

  5. 对于客户端的调用,必须暴露全部的策略类,客户端必须了解全部策略类以及策略类之间的区别。

相关文章
相关标签/搜索