玩转Java设计模式之策略模式

1.背景

  为什么想介绍下策略模式,因为我已经在很多场景下用到锅这个模式,相信很多人也是,这是java设计模式中非常常用的一个模式了。

2.策略模式介绍
1.什么是策略模式

  策略模式就是定义一系列算法,把他们一个一个封装起来,并且使他们可以相互替换.
  用人话来举个例子:就是你想去旅游,预算10w元,四个旅游团分别给出了四种方案(策略),你可以任意选择其中一个来获得不一样的旅游体验。

2.策略模式的作用

  举个例子吧:
一天老板除了个需求,我要用户按照不同的会员等级获得不一样的购物体验。

程序员小菜一听,这简单啊,于是分分钟写下了下边的代码。

    public void shop(User user) {
        if (user.getType() == 1) { // 普通用户
            // 此处省略500行
        } else if (user.getType() == 2) { // vip
            // 此处省略500行
        } else if (user.getType() == 3) { // svip
            // 此处省略500行
        } else {
            // 此处省略500行
        }
    }

程序员大鸟眉头一皱,发现事情并不简单。提出了自己的意见,这里的代码看起来好臃肿,购物的逻辑太复杂了,500行;以后又多了ssvip,sssvip可咋整呀。

小菜一听觉得很有道理,向大鸟取经。
大鸟眉头一皱,沉思片刻。发现事情很简单,你去看看策略模式吧!

3.策略模式

小菜听了大鸟的建议,去看了策略模式,并对以上述购物使用策略模式对代码进行了重构,如下。

第一步:定义购物策略的接口ShopStrategy

public interface ShopStrategy {
    void shop();
}

第二步:定义具体的购物策略实现类

    public static  class CommonStrategy implements ShopStrategy {
        @Override
        public void shop() {
            System.out.println("common shop");
        }
    }
    public static  class VipStrategy implements ShopStrategy {
        @Override
        public void shop() {
            System.out.println("vip shop");
        }
    }
    public static  class SvipStrategy implements ShopStrategy {
        @Override
        public void shop() {
            System.out.println("svip shop");
        }
    }

第三步:定义策略的环境类,将所有的实现类在map中维护起来方便使用

    public static class ShopStrategyParse {
        public Map<Integer, ShopStrategy> strategies = new HashMap<>();
        public ShopStrategyParse() {
            strategies.put(1, new CommonStrategy());
            strategies.put(2, new CommonStrategy());
            strategies.put(3, new CommonStrategy());
        }

        public void shop(User user) {
            ShopStrategy shopStrategy = strategies.get(user.type);
            shopStrategy.shop();
        }
    }

第四步:使用方式,直接使用环境类,传入用户即可获取到对应的购物策略

    public static void main(String[] args) {
        User user = new User(1); // 普通用户
        ShopStrategyParse strategyParse = new ShopStrategyParse();
        strategyParse.shop(user);
    }

小菜的购物需求使用策略模式已经重构完毕。
emmmm,看起来代码变的更多更复杂了的样子。其实并非是这样,代码的结构变得更加清晰了,后续的维护改造和加需求也会变得方便起来,用过就知道!

4.Spring与策略模式

值得一提的是,现在使用SpringBoot框架的相对较多,在使用Spring的时候,创建环境类的时候可以使用注入的方式将所有的实现类一把注入进去,改动如下:

第一步:修改下接口定义,将策略和类型对应起来

public interface ShopStrategy {
    int getId();
    void shop();
}

第二步:直接在构造器中注入List,即可注入所有的实现类,方便不~

    @Autowired
    public ShopStrategyParse(List<ShopStrategy> shopStrategyList) {
        strategies.forEach(strategy -> strategies.put(strategy.getId(), strategy));
    }

这样在spring中使用策略模式就完成了。

5.总结

就个人的经验来说,策略模式特别适合改造多if-else且其中的逻辑非特别简单的场景,这种时候无论if-else还是switch都不是很好,使用策略模式会让你的代码更加的优雅,逻辑更加清晰。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
策略模式(Strategy Pattern)是Java设计模式的一种行为型模式,它定义了一系列的算法,并将每个算法封装在独立的类,使得它们可以互相替换。这样可以使得算法的变化独立于使用它们的客户端。 在策略模式,有三个主要角色: 1. 环境类(Context):持有一个策略类的引用,用于调用具体的策略。 2. 抽象策略类(Strategy):定义了一个公共接口或抽象类,用于具体策略类的统一调用。 3. 具体策略类(Concrete Strategy):实现了抽象策略类定义的接口或抽象类,提供具体的算法实现。 使用策略模式可以实现算法的动态切换,增加新的算法也不会影响到已有的代码。例如,假设我们需要实现一个排序算法,可以定义一个抽象策略类 SortStrategy,然后具体的排序算法(如快速排序、归并排序等)分别实现 SortStrategy,并在环境类持有 SortStrategy 的引用。这样,通过更换不同的 SortStrategy 对象,就可以在运行时选择不同的排序算法。 策略模式能够有效地解耦策略的定义和使用,提高代码的灵活性和可维护性。同时,它也符合面向对象设计原则的"开闭原则"(对扩展开放,对修改关闭)和"单一职责原则"(一个类应该只有一个引起变化的原因)。 希望这个简要的介绍能够帮助到你对策略模式的理解。如果还有其他问题,可以继续提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java码农杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值