策略模式

在开发中,有时候实现一个功能有多种方法或者说是策略,在实现的过程当中能够根据条件来进行选择不一样的方法或者策略,好比对一个集合进行排序,能够根据客户端传进来的条件来选择不一样的排序算法,如冒泡排序,堆排序,快速排序......等。java

对于这种需求,通常的解决办法就是在一个方法中 经过 if....else if....else 或者 switch case 来解决,这样有一点很差的地方,若是咱们要添加一个新的算法,或者删除一个已有的算法,则必需要修改源代码来实现,去掉/添加一个 else 分支或者 case分支,代码的扩展性和维护性较差,对于这种需求的话,可使用策略模式来进行解决。算法

策略模式  :微信

定义一系列的算法,把每个算法封装起来, 而且使它们可相互替换。ide

下面以一个网购付款方式为例进行说明:测试

在网购付款的时候,能够选择的付款方式有不少种,如支付宝,微信,信用卡和 ApplePay等。微信支付

首先定义抽象策略类PayWaythis

public abstract class PayWay {
	
	public abstract boolean pay(double money);
	
}

定义具体策略类spa

支付宝支付类:code

/**
 * 支付宝支付
 * @author Administrator
 *
 */
public class AlPay extends PayWay{

	@Override
	public boolean pay(double money) {
		System.out.println(String.format("使用支付宝成功付款:%f", money));
		return true;
	}
}

微信支付类:orm

/**
 * 微信支付
 * @author Administrator
 *
 */
public class WeChatPay extends PayWay{

	@Override
	public boolean pay(double money) {
		System.out.println(String.format("使用微信成功付款:%f", money));
		return true;
	}
}

信用卡支付类:

/**
 * 信用卡支付
 * @author Administrator
 *
 */
public class CreditCardPay extends PayWay{

	@Override
	public boolean pay(double money) {
		System.out.println(String.format("使用信用卡成功付款:%f", money));
		return true;
	}
}

客户端类

在客户端类中,只需持有抽象策略类的一个引用。

class Client{
	private PayWay payWay = null;
	
	public void setPayWay(PayWay payWay) {
		this.payWay = payWay;
	}
	
	public void pay(double money){
		payWay.pay(money);
	}
}

测试:

public static void main(String[] args) {
		Client client = new Client();
		// 支付宝
		client.setPayWay(new AlPay());
		client.pay(1000);
		
		//微信
		client.setPayWay(new WeChatPay());
		client.pay(1000);
		
		//信用卡
		client.setPayWay(new CreditCardPay());
		client.pay(1000);
	}

结果:

使用支付宝成功付款:1000.000000
使用微信成功付款:1000.000000
使用信用卡成功付款:1000.000000

如今若是想添加一种新的付款方式,ApplePay,只需新加一个类,继承抽象策略类便可,

ApplePay类:

/**
 * ApplePay支付
 * @author Administrator
 *
 */
public class ApplePay extends PayWay{

	@Override
	public boolean pay(double money) {
		System.out.println(String.format("使用苹果成功付款:%f", money));
		return true;
	}
}

能够看到,新添加一个策略或者算法,对原来的代码没有改动,只是新加了一个类而已,若是想不使用某个算法或策略,如不想使用信用卡支付,则在客户端进行调用的时候,不传入 CreditCardPay对象便可,对原来的代码也没有改动,由此能够看到维护性和扩展性较高。

缺点:

策略模式也有它的缺点,如客户端在进行调用的时候,必须知道每一个算法或者策略的不一样;若是策略不少,则会有不少的具体策略类,形成大量的类。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息