首页 > 其他分享 >设计模式之策略模式

设计模式之策略模式

时间:2024-01-22 19:44:07浏览次数:29  
标签:设计模式 策略 复杂度 模式 选择 算法 组件 LayoutManager 排序

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)

标签:设计模式,策略,复杂度,模式,选择,算法,组件,LayoutManager,排序
From: https://www.cnblogs.com/jiujiubashiyi/p/17972743

相关文章

  • 设计模式——组合模式
    定义组合(CompositePattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。节点组合模式结构为一颗二叉树,存在三种节点Component:组合模式......
  • 【Python进阶】Python设计模式
    设计模式介绍什么是设计模式设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验,考虑了封装性、复用性、效率、可修改、可移植等各种因素的高度总结。它不限于一种特定的语言,它是一种解决问题的思想和方法为什么要用设计模式按照设计模式编写......
  • 观察者模式
    C#设计模式】16.观察者模式(ObserverPattern)【行为型】介绍  “观察者模式”在现实生活中,实例其实是很多的,比如:八九十年代我们订阅的报纸,我们会定期收到报纸,因为我们订阅了。银行可以给储户发手机短信,也是“观察者模式”很好的使用的例子,因为我们订阅了银行的短信业务,当我们账......
  • Linux基础45 firewalld防火墙, 参数, 区域配置, 放行策略, 端口转发, 富规则, 防火墙
    firewalld防火墙一、防火墙安全概述在Centos7系统中继承了多款防火墙管理工具,默认启动的是firewalld(动态防火墙管理器)防火墙管理工具,Firewalld支持CLI(命令行)以及(图形)的两种管理方式。对于接触Linux较早的人员对Iptables比较熟悉,但由于Iptables的规则比较的麻烦,并且对网络有......
  • 模板模式
    定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现补充:模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤类型:行为型适用场景:一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现各子类中公共的行为被提取出来并集中到一个公共父类......
  • 设计模式(二十二)模板方法
    一、定义定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的特定步骤。模板方法是一种类行为型模式二、描述模板方法模式结构比较简单,其核心是抽象类和其中的模板方法的设计,包含以下两个角色:1、AbstractClass(抽......
  • 关于变元极性选择策略
    1.2023年最新的一篇文献 New Boolean satisfiability problem heuristic strategy: Minimal Positive Negative Product Strategy@article{DBLP:journals/corr/abs-2310-18370,author={QunZhaoandXintaoWangand......
  • 设计模式
    八大原则:依开单替,接优封针依:依赖倒置原则高层次的代码不应该依赖低层次的代码,应该依赖抽象、抽象的代码不应该依赖具体的代码开:开闭原则对扩展开放,对修改关闭单:单一职责一个类应该仅有一个变化的原因,该变化隐含了它的职责,职责太多会造成混乱替:替换原则子类必须能够替换他......
  • Spark SQL五大关联策略
    1、五种连接策略选择连接策略的核心原则是尽量避免shuffle和sort的操作,因为这些操作性能开销很大,比较吃资源且耗时,所以首选的连接策略是不需要shuffle和sort的hash连接策略。◦BroadcastHashJoin(BHJ):广播散列连接◦ShuffleHashJoin(SHJ):洗牌散列连接◦ShuffleSortMergeJoi......
  • js设计模式之命令模式
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>命令模式</title></head><body><buttonid="btn1">刷新菜单</button><buttonid="btn2">增......