java设计模式实战-(反射+策略模式)

学完23种设计模式,相信很多同学都疑问,除了单例模式、工厂模式其他模式还有运用的场景吗?

现在这里就举一个例子。

首先策略模式需要先有了解,我们常用策略模式解决实际开发中的if else特别多的场景。但是在实际的开发中,真正单独只用策略模式的场景还是很少的。我们需要利用Spring的注入功能,实现根据不同的入参,跳转到不同的实现类中,以此来减少if else的使用。

举个场景:假如我们做物流系统,需要根据前段传过来的渠道参数,来定制化不同的规则校验逻辑。这里我们距离alibaba渠道和wechat渠道。那么我们应该怎么做呢?

大致思路:

1、定义抽象接口,提取一个抽象方法,这个方法的具体实现在各个渠道的类中

2、在service层,通过实现ApplicationContextAware接口,获取spring的applicationContext

3、在service层,通过入参确定需要跳转到哪个类实现定制的渠道规则。

具体代码如下:

第一步:

@Service
public interface Channel {
    void rule_control();
}
@Service
public class WechatChannel implements Channel {
    @Override
    public void rule_control() {
        System.out.println("进入到微信的渠道来源");
    }
}
@Service
public class AlibabaChannel implements Channel {
    @Override
    public void rule_control() {
        System.out.println("进入到阿里巴巴的渠道来源");
    }
}

第二步:在service层的写法:

@Service
public class BuyGoods implements ApplicationContextAware {


    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void judgeChannel(String buyGoodsChannel){
        String finalString = buyGoodsChannel+"Channel";
        Channel bean = (Channel)applicationContext.getBean(finalString);
        System.out.println("最终实际得到的bean名称:"+bean.toString());
        bean.rule_control();
    }

}

 最后在controller层传入的参数,模拟如下,结果见如上图:

    @RequestMapping("/buy")
    public String bug(){
        System.out.println("进入buy...Controller");
        String channel = "wechat";
        buyGoods.judgeChannel(channel);
        return "bug";
    }

总结:经过上面的简单处理,我们即完成了不同渠道根据入参定制不同实现类的要求,避免了if else的疯狂使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值