设计模式之策略模式

1. 定义

定义一系列算法,并将每个算法封装成一个独立的类,使它们可以相互替换

2. 口语化表述

策略模式通常适用于需要根据不同情况选择不同算法的场景,例如排序算法、计算税费等

现在说说排序算法,常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等,每种排序算法都有其特定的时间复杂度和空间复杂度,适用于不同规模和特点的数据集

  1. 冒泡排序(Bubble Sort):适用于小规模数据集,简单易懂,但时间复杂度较高,不适合大规模数据集

  2. 选择排序(Selection Sort):适用于小规模数据集,不稳定,时间复杂度较高,不适合大规模数据集

  3. 插入排序(Insertion Sort):适用于小规模数据集,对于已经部分有序的数据效率较高,不适合大规模数据集

  4. 快速排序(Quick Sort):适用于大规模数据集,平均时间复杂度较低,但在最坏情况下可能性能较差

  5. 归并排序(Merge Sort):适用于大规模数据集,稳定且时间复杂度较低,但需要额外的空间

选择排序算法时,需要根据具体的情况和需求来选择合适的排序算法。例如,如果需要对大规模数据集进行排序,可以选择快速排序或归并排序;如果数据集较小,可以选择冒泡排序或插入排序。同时,还可以根据数据的特点,如是否部分有序,来选择合适的排序算法以提高效率

根据数据集的情况选择不同的排序算法,这就是策略模式

(与状态模式相比,策略模式主要用于根据不同情况选择不同算法的场景,而状态模式侧重于同一对象不同状态选择不同执行方式)

下面的描述会沿用这个上述这个场景

3. 源码示例

在 Java AWT(Abstract Window Toolkit)中,LayoutManager 是用于管理容器中组件布局的接口。它定义了一系列方法,用于控制容器中组件的位置和大小,以确保它们能够正确地显示在界面上

Java AWT 提供了几种内置的 LayoutManager,每种都有其特定的布局方式,可以根据需要选择合适的 LayoutManager 来管理容器中的组件布局

一些常见的 LayoutManager 包括:

  1. BorderLayout:将容器分为东、西、南、北和中五个区域,每个区域只能容纳一个组件

  2. FlowLayout:按照添加顺序依次排列组件,当一行放不下时自动换行

  3. GridLayout:将容器分割为行和列,每个单元格中可以放置一个组件

  4. CardLayout:用于在同一个容器中管理多个组件,通过切换卡片来显示不同的组件

  5. GridBagLayout:提供了更灵活的布局方式,可以通过设置网格包的约束条件来控制组件的位置和大小

通过使用这些 LayoutManager,可以方便地实现各种不同的界面布局,使界面看起来更加美观和合理。在实际开发中,可以根据界面的需求选择合适的 LayoutManager 来管理容器中的组件布局

(如状态模式一文所言,其实这很类似于抽象基类与具体实现类的关系,抽象基类就是LayoutManager,具体实现类就是各种具体的LayoutManager,开发时根据需要选择具体实现类)

4. 总结

4.1 设计优点

  • 单一职责原则

    可以将算法的实现和使用算法的代码隔离开来

  • 开闭原则

    无需对上下文进行修改就能够引入新的策略

4.2 适用场景

  • 使用对象中各种不同的算法变体,并希望能在运行时切换算法

    这里类似于状态模式

  • 有许多仅在执行某些行为时略有不同的相似类

    将行为抽取为一个类进行复用

5. 参考资料

[1] 策略设计模式 (refactoringguru.cn)

[2] LayoutManager (Java Platform SE 8 ) (oracle.com)

posted @   当时明月在曾照彩云归  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示