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

news/2024/9/28 15:59:45/

策略模式简绍

策略模式(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{@Overridepublic void adapter(String port) {System.out.println("手机接口" + port);}
}public class ConcreteStrategiesB implements Strategy{@Overridepublic 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.ppmy.cn/news/1531558.html

相关文章

【算法】KMP算法

目录 1、暴力做法及优化 2、next数组的含义 3、匹配思路及代码 4、实现next数组 5、最终代码 kmp算法主要解决的是字符串匹配问题 1、暴力做法及优化 假设我们现在有一个长度为n的模式串p"aabaaf",一个长度为m的模板串s"aabaabaaf"&…

《机器学习》周志华-CH8(集成学习)

8.1个体与集成 集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统,基于委员会的学习。 同质”集成“:只包含同种类型的个体学习器,同质集成中的个体学习器亦称“基学习器”&#xff0…

git rebase 调整提交顺序

今天在提交代码到gerrit上面后发现该笔提交之前有一笔本地加日志测试用的提交一起被带上去了: 1AC30902 (HEAD -> master) normal commit, modify xxx 82CC31A4 add test log 2364BBD1 normal commit2, modify yyy 其中,第二笔提交因为只是测试使用的&#xff0…

Caddy在CentOS 7的安装与使用

Caddy是一个用Go语言编写的灵活和强大的web服务器,配置简单,自动HTTPS,可以为站点提供更好的安全性和性能。 安装 yum install yum-plugin-copr yum copr enable caddy/caddy yum install caddy启动Caddy caddy start 验证是否启动 curl l…

Qt开发技巧(八)自带对话框的美化,内置快捷代码段,巧用匿名槽函数,另类动态换肤,资源动态加载

继续讲一些Qt开发中的技巧操作: 1.自带对话框的美化 Qt中有一些自带的对话框,比如文件选择对话框,颜色选择对话框等等,这些对话框看着跟系统的对话框没太大差别,实际这是Qt有意为之,为的是跟系统保持一致。…

AI大模型日报#0923:李飞飞创业之后首个专访、华为云+腾讯音乐发布昇腾适配方案

导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE-4.0-8K-latest)、“智谱AI”(glm-4-0520)生成了今日要点以及每条资讯的摘要。欢迎阅…

一步一步丰富生成式语言模型系统

以下是这套生成式语言模型解决任务的流程图概述: #mermaid-svg-sRHDSMUMV1utrg2F {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sRHDSMUMV1utrg2F .error-icon{fill:#552222;}#mermaid-svg-sRHDSMUMV1u…

宝塔搭建nextcould 30docker搭建onlyoffic8.0

宝塔搭建nextcould 宝塔搭建nextcould可以参考这两个博文 我搭建的是30版本的nextcould,服务组件用的是下面这些,步骤是一样的,只是版本不一样而已 nginx 1.24.0 建议选择nginx,apache没成功。 MySQL 8.0以上都可以 php 8.2.…