1. 定义
定义一系列算法,并将每个算法封装成一个独立的类,使它们可以相互替换
2. 口语化表述
策略模式通常适用于需要根据不同情况选择不同算法的场景,例如排序算法、计算税费等
现在说说排序算法,常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等,每种排序算法都有其特定的时间复杂度和空间复杂度,适用于不同规模和特点的数据集
-
冒泡排序(Bubble Sort):适用于小规模数据集,简单易懂,但时间复杂度较高,不适合大规模数据集
-
选择排序(Selection Sort):适用于小规模数据集,不稳定,时间复杂度较高,不适合大规模数据集
-
插入排序(Insertion Sort):适用于小规模数据集,对于已经部分有序的数据效率较高,不适合大规模数据集
-
快速排序(Quick Sort):适用于大规模数据集,平均时间复杂度较低,但在最坏情况下可能性能较差
-
归并排序(Merge Sort):适用于大规模数据集,稳定且时间复杂度较低,但需要额外的空间
选择排序算法时,需要根据具体的情况和需求来选择合适的排序算法。例如,如果需要对大规模数据集进行排序,可以选择快速排序或归并排序;如果数据集较小,可以选择冒泡排序或插入排序。同时,还可以根据数据的特点,如是否部分有序,来选择合适的排序算法以提高效率
根据数据集的情况选择不同的排序算法,这就是策略模式
(与状态模式相比,策略模式主要用于根据不同情况选择不同算法的场景,而状态模式侧重于同一对象不同状态选择不同执行方式)
(下面的描述会沿用这个上述这个场景)
3. 源码示例
在 Java AWT(Abstract Window Toolkit)中,LayoutManager 是用于管理容器中组件布局的接口。它定义了一系列方法,用于控制容器中组件的位置和大小,以确保它们能够正确地显示在界面上
Java AWT 提供了几种内置的 LayoutManager,每种都有其特定的布局方式,可以根据需要选择合适的 LayoutManager 来管理容器中的组件布局
一些常见的 LayoutManager 包括:
-
BorderLayout:将容器分为东、西、南、北和中五个区域,每个区域只能容纳一个组件
-
FlowLayout:按照添加顺序依次排列组件,当一行放不下时自动换行
-
GridLayout:将容器分割为行和列,每个单元格中可以放置一个组件
-
CardLayout:用于在同一个容器中管理多个组件,通过切换卡片来显示不同的组件
-
GridBagLayout:提供了更灵活的布局方式,可以通过设置网格包的约束条件来控制组件的位置和大小
通过使用这些 LayoutManager,可以方便地实现各种不同的界面布局,使界面看起来更加美观和合理。在实际开发中,可以根据界面的需求选择合适的 LayoutManager 来管理容器中的组件布局
(如状态模式一文所言,其实这很类似于抽象基类与具体实现类的关系,抽象基类就是LayoutManager,具体实现类就是各种具体的LayoutManager,开发时根据需要选择具体实现类)
4. 总结
4.1 设计优点
-
单一职责原则
可以将算法的实现和使用算法的代码隔离开来
-
开闭原则
无需对上下文进行修改就能够引入新的策略
4.2 适用场景
-
使用对象中各种不同的算法变体,并希望能在运行时切换算法
这里类似于状态模式
-
有许多仅在执行某些行为时略有不同的相似类
将行为抽取为一个类进行复用
5. 参考资料
[1] 策略设计模式 (refactoringguru.cn)
[2] LayoutManager (Java Platform SE 8 ) (oracle.com)
标签:设计模式,策略,复杂度,模式,选择,算法,组件,LayoutManager,排序 From: https://www.cnblogs.com/jiujiubashiyi/p/17972743