前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用设计模式搞定女朋友,吃什么火锅,设计模式不香吗

用设计模式搞定女朋友,吃什么火锅,设计模式不香吗

作者头像
公众号 IT老哥
修改2020-09-21 15:29:24
3950
修改2020-09-21 15:29:24
举报

本文源自 公-众-号 IT老哥 的分享

IT老哥,一个在大厂做高级Java开发的程序员,每天分享技术干货文章

老哥哔哔叨

无论是人生还是代码,都面临着很多的选择,代码里面充斥着无数的if / else,人生不也是一样吗?无数的分岔路口,我们无法避免这些选择,但是我们可以更优美的去做选择—设计模式

谈恋爱的烦恼

不巧,今天又到了发奖金的时间了,女朋友第一时间过来催债了。

化悲伤为动力

每次钱包空空如也,就更加刺激我努力写代码,我发现霸王龙这次居然一口气用了3个if,有进步啊。但是如果我发的奖金更多,岂不是要说出10几个if来。不行,我得给她讲讲设计模式教育教育她,告诉她如何干掉代码里的if / else

if 伪代码

代码语言:javascript
复制
public String getBonusPlan(Integer bonus) {
    if (bonus.equals(100)) {
        if (饿了) {
            return "吃呷哺火锅";
        }
        return "在考虑考虑";
    } else if (bonus.equals(300)) {
        if (饿了) {
            return "吃蜀大侠火锅";
        }
        return "在考虑考虑";
    } else if (bonus.equals(500)) {
        return "吃海底捞火锅";
    }
    // 一大波火锅来袭。。。。
}

工厂模式 + 策略模式

这里不是标准的工厂模式,也不是标准的策略模式,是按照业务需要组合两者的使用。这个模式在工作中用到的情况会很多,如果大家有兴趣,我们可以单独写篇文章讲讲工厂和策略设计模式。

策略模式登场

  • 首先定义一个总的接口类
代码语言:javascript
复制
// 奖金接口
public interface BonusService {
   // 奖金如何使用方法
   public String useBonusPlan (Integer bonus);
}
  • 奖金使用方式一:去呷哺吃火锅
代码语言:javascript
复制
public class XiabuBonusService implements BonusService {
    @Override
    public String useBonusPlan(Integer bonus) {
        if (饿了) {
            return "去呷哺吃" + bonus + "元的火锅";
        }
        return "在考虑考虑";
    }
}
  • 奖金使用方式一:去蜀大侠吃火锅
代码语言:javascript
复制
public class ShudaxiaBonusService implements BonusService {

    @Override
    public String useBonusPlan(Integer bonus) {
        if (饿了) {
            return "去蜀大侠吃" + bonus + "元的火锅";
        }
        return "在考虑考虑";
    }
}
  • 奖金使用方式一:去海底捞吃火锅
代码语言:javascript
复制
public class HaidilaoBonusService implements BonusService {

    @Override
    public String useBonusPlan(Integer bonus) {
        return "去海底捞吃" + bonus + "元的火锅";
    }
}

用上策略模式后的变化

代码语言:javascript
复制
public String getBonusPlan(Integer bonus) {
    
    if (bonus.equals(100)) {
        XiabuBonusService xiabuBonusService = spring.getBean(XiabuBonusService.class);
        return xiabuBonusService.useBonusPlan(bonus);
    } else if (bonus.equals(300)) {
        ShudaxiaBonusService shudaxiaService = spring.getBean(ShudaxiaBonusService.class);
        return shudaxiaService.useBonusPlan(bonus);
    } else if (bonus.equals(500)) {
        HaidilaoBonusService haidilaoBonusService = spring.getBean(HaidilaoBonusService.class);
        return haidilaoBonusService.useBonusPlan(bonus);
    }
}

大家可以看到getBonusPlan这个方法可读性好了很多,我们将吃火锅算法封装到了一个一个的策略类里面,但是对于哪些情况下使用哪种算法的if判断,并没有减少呀。继续优化代码!

简单工厂设计模式

代码语言:javascript
复制
// 创建一个奖金工厂类
public class BonusStrategyFactory {

    // 用map来保存如何使用奖金的策略类
    private static Map<Integer, BonusService> strategyMap
    = new ConcurrentHashMap<Integer, BonusService>();

    // 通过奖金多少查找对应的使用策略
    public  static BonusService getByBonus(Integer bonus){
        return strategyMap.get(bonus);
    }

    // 将奖金和对应的使用策略注册到map里
    public static void register(Integer bonus, BonusService bonusService){
        Assert.notNull(bonus,"bonus can't be null");
        strategyMap.put(bonus, bonusService);
    }
}

加上工厂设计模式后,代码的变化

代码语言:javascript
复制
public String getBonusPlan(Integer bonus) {
    // 在工厂里通过奖金拿到对应的使用策略类
    BonusService strategyService = BonusStrategyFactory.getByBonus(bonus);
    // 调用策略类相应的方法
    return strategyService.getBonusPlan(bonus);
}

大家可以看到,策略设计模式 + 工厂设计模式,让我们的代码十分简洁,唯一的缺憾就是多了一些策略类,但是非常的解耦,以上代码只是演示伪代码。在真实复杂的业务场景中,设计模式能发挥非常重要的作用。

将策略注册到Map中

我们利用spring的InitializingBean这个接口来实现,拿蜀大侠那个类来举例。

云服务器云硬盘数据库(包括MySQL、Redis、MongoDB、SQL Server),CDN流量包,短信流量包,cos资源包,消息队列ckafka,点播资源包,实时音视频套餐,网站管家(WAF),大禹BGP高防(包含高防包及高防IP),云解析SSL证书,手游安全MTP移动应用安全云直播等等。

代码语言:javascript
复制
public class ShudaxiaBonusService implements BonusService, InitializingBean {

    @Override
    public String useBonusPlan(Integer bonus) {
        if (饿了) {
            return "去蜀大侠吃" + bonus + "元的火锅";
        }
        return "在考虑考虑";
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // 注册到Map中
        BonusStrategyFactory.register(300, this);
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT老哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文源自 公-众-号 IT老哥 的分享
  • 老哥哔哔叨
  • 谈恋爱的烦恼
  • 化悲伤为动力
  • if 伪代码
  • 工厂模式 + 策略模式
    • 策略模式登场
      • 用上策略模式后的变化
        • 简单工厂设计模式
          • 将策略注册到Map中
          相关产品与服务
          实时音视频
          实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开发者快速搭建低成本、低延时、高品质的音视频互动解决方案。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档