设计模式 22 策略模式

策略模式(Strategy Pattern)属于 行为型模式

生活中会面临很多抉择,每一个抉择会导向不同的结果,这时就会出现策略的选择。

程序中也是一样,而且更加复杂,生活中的抉择一般只有几个,但程序中可能有十多个甚至数十个,也就是我们常用的 if-else 或者 switch。当只有少量选择时,用这些没有问题,但一旦量比较大,代码的可读性和维护难度会迅速上升,这时候就建议使用 策略模式了。

这里以相加相减策略来介绍策略模式:

1、定义策略

/**
 * 策略
 */
public interface Strategy {

    /**
     * 运行策略
     * @param num1 数字1
     * @param num2 数字2
     * @return 结果
     */
    int doStrategy(int num1, int num2);

}

2、定义相加策略

/**
 * 相加策略
 */
public class Add implements Strategy {

    @Override
    public int doStrategy(int num1, int num2) {
        return num1 + num2;
    }
}

3、定义相减策略

/**
 * 相减策略
 */
public class Subtract implements Strategy {

    @Override
    public int doStrategy(int num1, int num2) {
        return num1 - num2;
    }
}

4、定义上下文

/**
 * 上下文
 */
public class Context {

    private Strategy strategy;

    /**
     * 指定策略
     * @param strategy 策略
     */
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    /**
     * 执行策略
     * @param num1 数字1
     * @param num2 数字2
     * @return 结果
     */
    public int executeStrategy(int num1, int num2) {
        return this.strategy.doStrategy(num1, num2);
    }

}

5、调用

// 定义上下文
Context context = new Context();
// 设置相加策略
context.setStrategy(new Add());
System.out.println(context.executeStrategy(2, 1));
// 设置相减策略
context.setStrategy(new Subtract());
System.out.println(context.executeStrategy(2, 1));

输出结果为:

3
1

可以发现,按照对应的策略执行了运算,这就是策略模式的基本实现。

可以看出,策略模式的实现方式与前面讲的状态模式非常相似,但它们是有本质区别的。

主要体现在转换是 主动还是 被动的。状态模式是由状态自动触发的,是 被动的;策略模式是指定策略再执行的,是 主动的。

1、算法可以自由切换。

2、避免使用多重条件判断。

3、扩展性良好。

1、策略类会增多。

2、所有策略类都需要对外暴露。

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

如果一个系统的策略多于 4 个,就需要考虑使用 混合模式,解决策略类膨胀的问题。

Original: https://www.cnblogs.com/codesail/p/16621270.html
Author: 程序航
Title: 设计模式 22 策略模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/715027/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • LTE上报信息中的CQI、PMI、RI的涵义,及信息中的SIR,CQI,RSSI

    用户感受:接入困难或者根本无法接入,语音质量不好,严重时甚至掉话; 观察终端:发射功率持续偏高(Rx+Tx>-70dBm)以上;有信号无法打电话,经过长时间接入后(20s),…

    技术杂谈 2023年5月31日
    086
  • 关于棣莫弗定理证明的一个延拓

    1.复数 我们把形如a+bi的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位,a,b∈R. 在复平面内,任何一个复数都可以表示为r(cosθ+isinθ)的形式,其中,θ叫…

    技术杂谈 2023年5月31日
    087
  • 手把手教你用JAVA调用Websocket实现“声音转换”功能(变声)标贝科技

    手把手教你用JAVA调用Websocket实现”声音转换”功能(变声)标贝科技 前言 什么是声音转换?基于深度学习和迁移学习技术,精准将原说话人的声音转换为…

    技术杂谈 2023年7月25日
    056
  • django model字段类型

    1、models.AutoField 自增列=int(11)如果没有的话,默认会生成一个名称为id的列,如果要显示的定义一个自增列,必须把该列设置为主键(primary_key=T…

    技术杂谈 2023年7月10日
    047
  • Java的三大特性

    Java的三大特性 封装: 隐藏内部功能的具体实现,只保留和外部交流数据的接口,将变化隔离,便于使用,提高复用性和安全性。例:汽车与发动机,不必知道发动机的实现原理,只需使用汽车给…

    技术杂谈 2023年7月24日
    073
  • 网络游戏术语(转)

    转自:https://site.douban.com/149989/widget/notes/8053161/note/231207595/ AC – Armor Class,盔甲…

    技术杂谈 2023年5月31日
    078
  • [python]-random模块-手动随机数

    random模块通常用来生成随机数,结合time模块生成随机数的代码: import time import random random.seed(time.time()) x =…

    技术杂谈 2023年7月10日
    054
  • 接口测试

    :配置windows中特定应用的抓包(默认抓取不到) :添加备注信息 :重新发起指定请求 :清空指定会话内容 :断点放行 :模式切换 :相应数据解码 :抓取指定进程发出的请求 :关…

    技术杂谈 2023年7月25日
    060
  • 小程聊微服务-增艺眼中的自己主动化測试

    假设说”生活不仅仅有眼前的苟且,还有诗和远方”的话,那么自己主动化測试可以说是非常多測试人员心中的”诗和远方”。 “诗和…

    技术杂谈 2023年5月31日
    085
  • Ubuntu解决Github无法访问的问题

    技术背景 由于IP设置的问题,有时候会出现Github无法访问的问题,经过一番的资料检索之后,发现如下的方案可以成功解决在Ubuntu下无法正常访问Github的问题(有时候可以打…

    技术杂谈 2023年7月25日
    096
  • 寿司店问题 PV操作 pthread表示

    寿司店问题。假设一个寿司店有 5 个座位,如果你到达的时候有一个空座位,你可以立刻就坐。但是如果你到达的时候 5 个座位都是满的有人已经就坐,这就意味着这些人都是一起来吃饭的,那么…

    技术杂谈 2023年7月25日
    058
  • C# 窗体DataGridView单元格内多个按钮

    在网上找了两种,基本一样,不同点是把button控件”画”在单元格,还是用画笔生成元素”画”在单元格 1、C# 窗体DataGrid…

    技术杂谈 2023年5月31日
    064
  • 特定声音识别检测模块详解

    需求解析 对于养宠物的人来说,识别宠物的叫声并根据它的叫声来判断是否出现了异常。宠物叫声一般都比较单一,难度相对较低,准确性有保障。 病人健康检测:通过声音识别,可以检测出人夜晚打…

    技术杂谈 2023年5月31日
    087
  • Qt Creator pro文件常见配置

    HEADERS:指定项目的头文件(.h) SOURCES:指定项目的源文件(.cpp) FORMS:指定协议UIC处理的由Qt Designer生成的.ui文件 RESOURCES…

    技术杂谈 2023年7月11日
    084
  • Game Engine Architecture 12

    【 Game Engine Architecture 12】 1、the field of physics is vast, and what most of today&#821…

    技术杂谈 2023年5月31日
    0102
  • PriorityQueue使用介绍

    这玩意儿叫优先级队列,是一个类,继承了AbstractQueue类,实现了Serializable接口。jdk文档里是这么描述这玩意的: 基于优先级堆的无限优先级queue 。 优…

    技术杂谈 2023年5月31日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球