else 策略模式去掉if_浅谈用策略模式避免 java 中繁琐的 if else if

前段时间由于项目比较多,也没有时间停下脚步思考一些技术上的东西。这不终于有了短暂的“闲暇“,忙里偷闲把工作中遇到的一些问题和感想分享给大家,供大家参考,作为程序员我们必须时刻给自己充电,紧跟时代的步伐。

在做一个第三发平台时需要接入以下几种下商户充值方式,手机支付,网银支付,商户账号支付和点卡支付。由于每个商家的结算系统不一样并且充值方式也有所不同,所以情景比较复杂。由于不想用老掉牙的if else结构语句进行判断故而在研究策略模式后,小试牛刀用这种模式进行简单的实现。

由于每种商家的结算方式不一样故对手续费低的做一些优惠,尽可能让用户使用手续费低 的支付方式来充值,这样降低渠道费用,增加收入,具体优惠政策如下:

网银充值,8.5折

商户充值,9折

手机充值,没有优惠

点卡充值,收取1%的渠道费

之前的代码:

以上代码虽然实现了基本功能,但是四种计算方式都在一个方法内部,如果优惠模式又增加了几十种,代码会变成什么样?你是否愿意来维护和扩展这样的代码?

策略模式(Policy)

定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。使得算法可独立于使用它的客户而变化。也称为政策模式(Policy)。

创建抽象策略角色Strategy:

根据需求,分别实现Strategy即具体策略角色:

创建环境角色Context:

StrategyFactory工厂,负责Strategy实例的创建:

开始测试:

运行结果:

85.0

90.0

100.0

101.0

从上面类图和代码可以看出,策略模式把具体的算法封装到了具体策略角色内部,增强了可扩展性,隐蔽了实现细节;它替代继承来实现,避免了if- else这种不易维护的条件语句。当然我们也可以看到,策略模式由于独立策略实现,使得系统内增加了很多策略类;对客户端来说必须知道都有哪些具体策略, 而且需要知道选择具体策略的条件。

总结:

凡事具有两面性,策略模式也不例外,下面简单列举一下策略模式的优缺点。

优点:

1:消除了一些if else条件语句 :Strategy模式提供了用条件语句选择所需的行为以外的另一种选择。当不同的行为堆砌在一个类中时 ,很难避免使用条件语句来选择合适的行为。将行为封装在一个个独立的Strategy类中消除了这些条件语句。含有许多条件语句的代码通常意味着需要使用Strategy模式。

2:相关算法系列 Strategy类层次为Context定义了一系列的可供重用的算法或行为。 继承有助于析取出这些算法中的公共功能。

缺点:

1:客户端必须知道所有的策略类,并自行决定使用哪一个策略类:  本模式有一个潜在的缺点,就是一个客户要选择一个合适的Strategy就必须知道这些Strategy到底有何不同。此时可能不得不向客户暴露具体的实现问题。因此仅当这些不同行为变体与客户相关的行为时 , 才需要使用Strategy模式。

2:.Strategy和Context之间的通信开销 :无论各个ConcreteStrategy实现的算法是简单还是复杂, 它们都共享Strategy定义的接口。因此很可能某些 ConcreteStrategy不会都用到所有通过这个接口传递给它们的信息;简单的 ConcreteStrategy可能不使用其中的任何信息!这就意味着有时Context会创建和初始化一些永远不会用到的参数。如果存在这样问题 , 那么将需要在Strategy和Context之间更进行紧密的耦合。

各位爷,赏小的一口饭呗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值