0
点赞
收藏
分享

微信扫一扫

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

何以至千里 2022-03-17 阅读 50

老哥哔哔叨

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

谈恋爱的烦恼

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

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

化悲伤为动力

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

if 伪代码

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 "吃海底捞火锅";
}
// 一大波火锅来袭。。。。
}

工厂模式 + 策略模式

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

策略模式登场

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

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

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

用上策略模式后的变化

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判断​​,并没有减少呀。继续优化代码!

简单工厂设计模式

// 创建一个奖金工厂类
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);
}
}

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

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

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

将策略注册到Map中

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

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);
}
}

老哥结语

虽然私房钱咱藏不住,但是又通过这次惨痛的教训,学到一门新技术,挺好挺好,让暴风雨来的更猛烈些吧。

IT 老哥

用设计模式搞定女朋友,吃什么火锅,设计模式不香吗_spring_02​一个在大厂做高级Java开发的程序猿​

关注微信公众号:IT 老哥

回复:Java 全套教程,即可领取:Java 基础、Java web、JavaEE 全部的教程,包括 spring boot 等

回复:简历模板,即可获取 100 份精美简历

回复:Java 学习路线,即可获取最新最全的一份学习路线图

举报

相关推荐

0 条评论