首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >设计模式精讲——策略模式

设计模式精讲——策略模式

作者头像
Regan Yue
发布2022-04-08 18:42:16
发布2022-04-08 18:42:16
3470
举报
文章被收录于专栏:ReganYue's BlogReganYue's Blog

设计模式精讲——策略模式

一、何为策略模式?

根据《设计模式之美》,策略模式(Strategy Pattern)是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通俗一点,就是你去买菜,可以选择骑共享单车去菜市场,也可以坐公交车,也可以滴滴打车,当然也可以选择不行,骑共享单车、坐公交车、滴滴打车、步行这都是不同的策略,但是你们的出发点和目的地都是一样的,因此这些策略是可以互换的,不影响你去买菜。

二、何时使用策略模式?

当使用超过3层的if-else或者长串的switch条件判断,我们就要考虑使用策略模式了,当然不只是这一种方法,工厂模式、状态模式也可以。

这是为什么呢?

因为使用超过3层的if-else或者长串的switch条件判断违反了:

  • 单一职责原则:即一个类只需要完成一个职责,比如我们常见的淋浴器材的旋钮,往一边是变热,一边是变冷,往往我们不能很好的控制水温,经常一会儿凉,一会儿烫。这是一个物理问题,由此产生了一个被称为淋浴方程的东西:

这是因为热水需要一定时间才能到你身上。还有一个重要的原因是旋钮的刻度不是均匀的。所以我们使用起来不方便。

但是如果我们采取单一职责原则,热水一个旋钮,冷水一个旋钮,就能容易控制了。

  • 开闭原则:对扩展开放,对修改关闭。

如果使用超过3层的if-else或者长串的switch条件判断且之中的代码量比较大时,后续代码的扩展和修改就会变得异常困难。

三、策略模式实例

下面就来用策略模式,实现我们去菜市场买菜的情形吧~

接口:

代码语言:javascript
复制
/**
 * 去菜市场策略的接口(Strategy)
 */
interface goToMarketStrategy {
    void action();
}

具体方式,比如骑共享单车。

代码语言:javascript
复制
/**
 * 骑共享单车(ConcreteStrategy)
 */
public class sharedBike implements goToMarketStrategy {
    
    @Override
    public void action() {
        System.out.println("骑上我心爱的小单车...");
    }
}

具体方式,坐公交车。

代码语言:javascript
复制
/**
 * 坐公交车(ConcreteStrategy)
 */
public class Bus implements goToMarketStrategy {
    
    @Override
    public void action() {
        System.out.println("滴!学生卡...");
    }
}

滴滴太贵了,咋就不坐了~

具体方式,步行。

代码语言:javascript
复制
/**
 * 步行(ConcreteStrategy)
 */
public class walking implements goToMarketStrategy {
    
    @Override
    public void action() {
        System.out.println("我爱走路,身体棒棒...");
    }
}

环境类 谁决策,我决策。

代码语言:javascript
复制
/**
 * 小伞(Context)
 */
public class 小伞 {

    private goToMarketStrategy strategy ;

    public 小伞(goToMarketStrategy strategy) {
        this.strategy = strategy;
    }

    // 居家好男人要去买菜了。
    // 具体执行哪个,看我选哪个。
    public void exec() {
        strategy.action();
    }
}

你是上帝,你来。。。

代码语言:javascript
复制
public class Main {

    public static void main(String[] args) {

        //第一个叫小伞的boy走路去买菜。
        小伞 boy1 = new 小伞(new walking());
        boy.exec();
        //第二个叫小伞的boy骑共享单车去买菜。
        小伞 boy2 = new 小伞(new sharedBike());
        boy.exec();
        
        // ......
    }
}
四、优缺点

优点:

  • 很好的支持开闭原则,我们可以在不修改原本系统的基础上选择算法或行为,也可以方便地增加新的算法或行为
  • 能够避免多重条件选择语句
  • 不一样的环境类都能对策略类进行复用

缺点:

  • 客户端必须得清楚全部策略类,并做出决定采用哪一个策略类
  • 会导致系统生成许多具体策略类
  • 不能同时在客户端中使用多个策略类
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/04/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计模式精讲——策略模式
    • 一、何为策略模式?
    • 二、何时使用策略模式?
    • 三、策略模式实例
    • 四、优缺点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档