设计模式 策略模式(Strategy Pattern)

news2025/2/22 17:29:38

策略模式简绍

策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。该模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

组成部分:

  • 环境(Context)类:它含有一个Strategy类型的成员变量,并且有一个方法与Strategy类型关联,通常会提供一个设置Strategy对象的方法。
  • 策略接口(Strategy):定义了一个统一的算法操作抽象接口。
  • 具体策略类(Concrete Strategies):实现了策略接口中定义的算法。

策略模式优缺点

优点:
  • 易于理解和实现:策略模式的概念简单明了,实现也不复杂。
  • 提高系统维护性:策略模式将一系列的算法封装在一个个独立的类中,使得可以方便地增加新的算法或者改进已有算法而不影响客户端代码。
  • 增强系统的灵活性:策略模式允许在运行时动态地更改算法或行为,增强了系统的灵活性。
  • 符合开闭原则:新的算法可以自由添加到系统中而不影响现有的客户端代码,因为客户端是通过策略接口来访问算法的。
缺点:
  • 客户端必须了解所有的策略类:客户端需要知道所有可用的策略类,并自行决定使用哪一个策略,这增加了客户端的复杂度。
  • 策略类的增加导致类的数目增加:每增加一种算法都需要新增一个策略类,如果算法很多,则会导致系统中类的数量急剧增加。
  • 过多的子类可能导致系统复杂化:如果策略类太多,可能会导致系统难以管理和理解。
  • 在某些情况下,策略模式可能不如继承有效:如果所有可能的变化都来源于同一个维度,那么继承可能比组合更合适。

UML图

以下代码示例图,ConcreteStrategiesA,ConcreteStrategiesB 实现了 Strategy 接口
在这里插入图片描述

实现代码

策略接口(Strategy):

定义了一个名为 Strategy 的接口,包含一个 adapter 方法,用于适配不同的接口类型。

public interface Strategy {
    void adapter(String port);
}
具体策略类(Concrete Strategies):

ConcreteStrategiesA 实现了 Strategy 接口,并提供了针对手机接口的适配逻辑。
ConcreteStrategiesB 实现了 Strategy 接口,并提供了针对电脑接口的适配逻辑。

public class ConcreteStrategiesA implements Strategy{

    @Override
    public void adapter(String port) {
        System.out.println("手机接口" + port);
    }
}

public class ConcreteStrategiesB implements Strategy{

    @Override
    public void adapter(String port) {
        System.out.println("电脑接口" + port);
    }
}
环境类(Context):

Context 类持有策略对象,并提供了一个 adapter 方法,用于调用策略对象的 adapter 方法。
通过构造函数注入策略对象,使得 Context 可以在运行时动态地选择不同的策略。

public class Context {

    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public void adapter(String prot){
        strategy.adapter(prot);
    }

}
主类(Main):

创建了两个不同的 Context 对象,分别使用 ConcreteStrategiesA 和 ConcreteStrategiesB。
调用 adapter 方法,输出不同的适配信息。

public class Main {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStrategiesA());
        context.adapter("usb-c");
        Context context1 = new Context(new ConcreteStrategiesB());
        context1.adapter("usb-c");
    }
}

常用场景

  • 算法选择
    当存在多种算法可以实现同一功能时,可以使用策略模式来动态地选择和切换算法。例如,在排序算法中,可以选择冒泡排序、快速排序、插入排序等多种算法。
  • 行为配置
    在某些场景下,需要根据不同的配置或上下文来选择不同的行为。例如,在游戏中,角色可能具有不同的攻击策略,如近战攻击、远程攻击或魔法攻击。
  • 多种配置选项
    在某些应用中,需要根据不同的配置来选择不同的处理方式。例如,在数据处理中,可能需要选择不同的数据格式进行读取或写入。

策略模式非常适合以下场景:
- 需要在运行时动态选择算法或行为。
- 存在多种实现方式,但实现方式的细节不应该影响到客户端。
- 需要将算法的实现与使用算法的客户端相分离。

通过策略模式,可以将算法的实现与使用算法的客户端相分离,使得系统更加灵活和可扩展

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计网】从零开始掌握序列化 --- 实现网络计算器项目

​​​请各位保持头脑清醒, ​​​读些好书,做点有用的事, ​​​快快乐乐地生活。 ​​​ --- 斯蒂芬金 《肖申克的救赎》--- 从零开始掌握序列化 1 知识回顾2 服务器框架3 客户端框架4 运行测试 1 知识回顾 前面两篇文章学习中基础知识…

CSS 实现文本溢出省略号显示,含单行与多行文本溢出

🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

[翟旭发射器]python-推导式-列表list表达式练习

# 简单的列表生成 numbers00[x for x in range(1,11)] print(numbers00) # 带条件的列表生成 numbers01[x for x in range(1,11) if x%20] print(numbers01) # 带表达式的列表生成 numbers10[x**2 for x in range(1,11)] print(numbers10) # 嵌套循环的列表生成 coordinates[(x…

UE4_Niagara基础实例—使用自定义参数

实现的功能:使用自定义的参数来调整粒子远离发射器后粒子大小的变化 效果图: 操作步骤: 1、创建Niagara系统,使用Simple Sprite Burst模板作为新系统的发射器,更名为NS_Custompara。 2、双击打开Niagara系统编辑界面…

Shopee 大促想爆单如何准备?EasyBoss ERP为你准备了一份攻略!

Shopee下半年第二个大促节点——10.10品牌大促即将来到,根据Shopee的官方的数据,9.9大促当天,Shopee Mall单量增至平日4倍。 老板们,准备好自己的热卖爆款冲击10.10大促了吗? 图源:Shopee 为助力大家迎战大…

NetApp EF 系列全闪存阵列 EF600 和 EF300

功能强大且经济实惠的性能 NetApp EF600 全闪存阵列专为需要最高性能的工作负载而设计。NetApp EF300阵列专为大数据分析和数据库等混合工作负载环境而设计。这些NVMe全闪存阵列的性能是以前SAS全闪存阵列的两倍。您可以使用专为高性能工作负载打造的端到端 NVMe 存储平台来加速…

node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放

1. 服务地址(私有):https://gitee.com/nnlss/video-node-server 2.node-rtsp-stream 需要安装FFMPEG; 3.给推拉流做了开关,可借助http请求,有更好方式可联系; 4.存在问题: 1&…

Vue中集中常见的布局方式

布局叠加 完整代码最外层的Container设置为relative&#xff0c;内部的几个box设置为absolute <template><div class"container"><div class"box box1">Box 1</div><div class"box box2">Box 2</div><d…

导出Power bi中的Measure

工作中做交接文档时&#xff0c;有时需要导出Power BI中所有度量值&#xff0c;这时可以下载两个工具。 一 &#xff0c; 下载工具&#xff1a; 1 &#xff0c; DaxStudio&#xff1a; http://daxstudio.org/ 2&#xff0c; Vertipaq Analyzer&#xff1a; https://www.sqlbi.c…

1.1 elasticsearch分布式集群基本搭建(centos7.x + elaticsearch7.11.1)

【1】分布式分片集群基础概念 【1.1】ES的分布式集群有什么用&#xff1f; 高可用 高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。如果系统每运行100个时间单位&#xff0c;会有…

半导体供应链系统在智能时代的主要作用

在智能科技日新月异的今天&#xff0c;半导体作为信息技术的基石&#xff0c;其供应链系统的稳定与高效直接关系到全球科技产业的脉动。智能时代的浪潮下&#xff0c;半导体供应链系统不仅是技术的输送带&#xff0c;更是推动产业创新、促进经济转型升级的关键力量。本文我们就…

将Uni.app打包好的apk放到IIS服务器上的详细流程

第一步&#xff1a;打开IIS服务器&#xff0c;点击MIME类型 第二步&#xff1a;点击添加 第三步&#xff1a;文件扩展名填写&#xff1a;.apk &#xff0c; MIME 类型填写&#xff1a;application/vnd.android.package-archive 第四步&#xff1a;添加成功后重启IIS服务器 第五…

【大模型实战篇】一种关于大模型高质量数据的处理方法-无标注数据类别快速识别及重复数据检测(加权向量-卷积神经网络-聚类算法结合)

1. 背景介绍 大模型的能力很大程度上依赖于高质量的数据&#xff0c;在之前的一篇文章《高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍》中&#xff0c;我们介绍了大模型的数据处理链路&#xff0c;本文继续关注在高质量数据的模块。 本文所要介绍的处理方法&…

C语言课程设计题目(24个选题)

C语言课程设计题目 题目一&#xff1a;职工信息管理系统设计题目二&#xff1a;图书信息管理系统设计题目三&#xff1a;图书管理系统设计题目四&#xff1a;实验设备管理系统设计题目五&#xff1a;西文下拉菜单的设计题目六&#xff1a;学生信息管理系统设计题目七&#xff1…

R包:gplots经典热图

加载R包 # install.packages("gplots")library("gplots")数据 mat <- matrix(rnorm(1200), ncol6)画图1 heatmap.2(xmat)画图2 heatmap.2(xmat, ColvFALSE, dendrogram"row",scale"row",col"bluered",trace"non…

用Python提取PDF表格到Excel文件

在对PDF中的表格进行再利用时&#xff0c;除了直接将PDF文档转换为Excel文件&#xff0c;我们还可以提取PDF文档中的表格数据并写入Excel工作表。这样做可以避免一些不必要的文本和格式带来的干扰&#xff0c;获得更易于分析和处理的表格数据&#xff0c;并方便进行更多的格式设…

uniapp监听滚动实现顶部透明度变化

效果如图&#xff1a; 实现思路&#xff1a; 1、使用onPageScroll监听页面滚动&#xff0c;改变导航条的透明度&#xff1b; 2、关于顶部图片的高度&#xff1a; 如果是小程序&#xff1a;使用getMenuButtonBoundingClientRect获取胶囊顶部距离和胶囊高度&#xff1b; 如果…

List几种遍历方法速度

准备数据 ArrayList<Integer> list new ArrayList<Integer>();for (int i 0; i < 100000000; i) {list.add(i); }1.for循环 for (int i 0; i < list.size(); i) {Integer str list.get(i); }2.for-each循环 for (Integer vo:list) {}3.Lambda list.forEa…

XXl-SSO分布式单点登录框架

概述 下载地址&#xff1a;https://gitee.com/xuxueli0323/xxl-sso 文档地址&#xff1a;https://www.xuxueli.com/xxl-sso/ 概述 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、CookieToken均支持…

工业数据采集系统

一、网页部分代码 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…