前段时间由于项目比较多,也没有时间停下脚步思考一些技术上的东西。这不终于有了短暂的“闲暇“,忙里偷闲把工作中遇到的一些问题和感想分享给大家,供大家参考,作为程序员我们必须时刻给自己充电,紧跟时代的步伐。
在做一个第三发平台时需要接入以下几种下商户充值方式,手机支付,网银支付,商户账号支付和点卡支付。由于每个商家的结算系统不一样并且充值方式也有所不同,所以情景比较复杂。由于不想用老掉牙的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之间更进行紧密的耦合。
各位爷,赏小的一口饭呗。
网友评论