设计模式探索之策略模式

我们以一个例子来说明策略模式: 在我们的项目中有个需求:用户提交完订单需要进行支付的时候可以选择不同的支付方式,支付方式有三种:支付宝、微信和银联。<br> 通常的实现方式是使用if...else语句进行实现:<br>

if ( payType.equals("支付宝") ){
   // 调用支付宝支付的算法...
} else  if ( payType.equals("微信") ){
    //调用微信的支付算法...
} else  if  (payType.equals("银联") ){
    //调用银联支付算法...
}

以上的实现思路极不推荐,它的缺点也非常的明显,对支付方式的选择严重耦合在了代码中,对后期的维护和扩展极不方便,假如我们后期对需求进行叠加,需要添加苹果支付,那就需要在代码中再添加苹果支付的判断。是不是有一种要疯的感觉.....<br> 下面就可以使用策略模式来实现上述需求:

首先我们定义一个支付的抽象接口:

public interface PayStragety {
	
	void pay(String no);
	
}

然后定义一组支付的算法,实现了该抽象接口:

//支付宝支付算法
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>


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>

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. 对于客户端的调用,必须暴露所有的策略类,客户端必须了解所有策略类以及策略类之间的区别。

转载于:https://my.oschina.net/u/2477500/blog/1570226

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值