设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

刚来的大神彻底干掉了代码中的if else...(2)

发布时间:2019-12-06 01:45 所属栏目:119 来源:站长网
导读:System.out.println(普通会员商品的最终价格为:+quote.doubleValue()); strategy=newSuperVipPayService(); quote=strategy.quote(300); System.out.println(超级会员商品的最终价格为:+quote.doubleValue()); }

        System.out.println("普通会员商品的最终价格为:" + quote.doubleValue()); 

 

        strategy = new SuperVipPayService(); 

        quote = strategy.quote(300); 

        System.out.println("超级会员商品的最终价格为:" + quote.doubleValue()); 

    } 

以上,就是一个例子,可以在代码中 New 出不同的会员的策略类,然后执行对应的计算价格的方法。

但是,真正在代码中使用,比如在一个 Web 项目中使用,上面这个 Demo 根本没办法直接用。

首先,在 Web 项目中,上面我们创建出来的这些策略类都是被 Spring 托管的,我们不会自己去 New 一个实例出来。

其次,在 Web 项目中,如果真要计算价格,也是要事先知道用户的会员等级,比如从数据库中查出会员等级,然后根据等级获取不同的策略类执行计算价格方法。

那么,Web 项目中真正的计算价格的话,伪代码应该是这样的:

/** 

 * @author mhcoding 

 */ 

public BigDecimal calPrice(BigDecimal orderPrice,User user) { 

 

     String vipType = user.getVipType(); 

 

     if (vipType == 专属会员) { 

        //伪代码:从Spring中获取超级会员的策略对象 

        UserPayService strategy = Spring.getBean(ParticularlyVipPayService.class); 

        return strategy.quote(orderPrice); 

     } 

 

     if (vipType == 超级会员) { 

        UserPayService strategy = Spring.getBean(SuperVipPayService.class); 

        return strategy.quote(orderPrice); 

     } 

 

     if (vipType == 普通会员) { 

        UserPayService strategy = Spring.getBean(VipPayService.class); 

        return strategy.quote(orderPrice); 

     } 

     return 原价; 

通过以上代码,我们发现,代码可维护性和可读性好像是好了一些,但是好像并没有减少 if-else 啊。

但是,策略模式的使用上,还是有一个比较大的缺点的:客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。

也就是说,虽然在计算价格的时候没有 if-else 了,但是选择具体的策略的时候还是不可避免的还是要有一些 if-else。

另外,上面的伪代码中,从 Spring 中获取会员的策略对象我们是伪代码实现的,那么代码到底该如何获取对应的 Bean 呢?

接下来我们看如何借助 Spring 和工厂模式,解决上面这些问题。

工厂模式

为了方便我们从 Spring 中获取 UserPayService 的各个策略类,我们创建一个工厂类:

/** 

 * @author mhcoding 

 */ 

public class UserPayServiceStrategyFactory { 

 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读