场景
此时有一个场景,需要设计一个根据不同的状态和条件采用不同的业务处理方式。
这样大家可能不是太理解。举个例子,现在大街小巷上的商户都采用了聚合支付的支付方式,聚合支付也就是商户柜台前放了一个支持支付宝、微信、京东钱包、银联等等的二维码,用户可以通过任意一款支付APP进行支付。
解决思路
思路①
对每个支付渠道进行定义枚举类型
public enum PayWay { ALI_PAY, WECHAT_PAY; }然后在每个对应的service上定义注解,表示对应哪种支付方式
@Pay(PayWay.ALI_PAY) public class AliPayServiceImpl implements PayService {}但是仔细思考后,还是存在一些问题
- 如果增加一个支付方式后还需要修改,
PayWay这个枚举类型 - 在程序中,仍需要根据不同的条件做
if else判断PayWay,增加支付方式还是得修改原有的判断逻辑。伪代码如下
if("xxx" == "aliPay"){ } else if("xxx" == "wechatPay"){ } //如果增加支付方式还是得增加else if思路②
在思路①中存在一些问题,首当其冲的就是if else判断问题。先思考一下这个if else的作用是什么?
答:根据思路①描述,这个if else是用来确定采用哪种支付方式。
我们可以将这块代码抽离出来,让对应的业务实现类实现自己的逻辑实现,然后根据返回值true 或者false决定是否过滤掉这个业务实现类。接口定义如下,SupportBean是封装的一个实体
boolean isSupport(SupportBean supportBean);然后在各个业务实现类都实现自己的isSupport方法,伪代码如下
@Override public boolean isSupport(SupportBean supportBean) { if (supportBean.getType() == "xxx"){ return true; } return false; }设计
注:只提供一个架子
接口定义
Service接口定义,一个业务执行方法execute(参数自行添加),一个isSupport方法(返回true或者false)
