当前位置: 首页 > news >正文

【设计模式深度剖析】【4】【行为型】【策略模式】

文章目录

  • 策略模式
  • 定义
    • 英文原话
    • 直译
  • 角色
    • 类图
    • 策略接口`Strategy`:
    • 具体策略类
    • 上下文类Context
    • 测试类
  • 策略模式的应用
    • 策略模式的优点
    • 策略模式的缺点
    • 策略模式的使用场景

策略模式

策略模式(Strategy Pattern)

Strategy策略也称作Policy政策。

想象一下我们正在玩一个角色扮演游戏。在游戏中,我们的角色有多种技能可以选择,比如“火球术”、“冰霜箭”和“治愈术”。每种技能都有不同的效果和用途。现在,游戏设计师希望让我们能够随时切换这些技能以适应不同的战斗场景。

策略模式就是这样一种设计思想。它允许我们定义不同的“技能”(即策略),然后在游戏中根据需要随时切换使用哪种技能。这样,我们就可以更加灵活地应对各种战斗情况了。

同样地,在计费系统或商城促销活动中,策略模式也允许我们根据不同的条件选择不同的计费方式或优惠策略,使得系统更加灵活和可配置。

定义

英文原话

Define a family of algorithms, encapsulate each one, and make them interchangeable.

直译

定义一系列的算法,把它们一个个封装起来,并且是他们可相互替换(必然实现了相同的接口,不然无法相互替换,该接口就是策略接口)

本模式使得算法可独立于使用它的客户而变化。

角色

  1. 策略接口(Strategy):定义所有支持的算法的公共接口。
  2. 具体策略(ConcreteStrategy):实现策略接口的类,具体策略类实现了算法的具体逻辑。
  3. 上下文(Context):使用策略接口的类,也称为“上下文”或“客户端”。上下文类内部持有一个策略对象的引用,并且负责在需要的时候调用策略对象的算法。

类图

在这里插入图片描述

在策略模式中,我们可以将这三个角色用Java类来具体实现。以下是一个简化的策略模式示例,其中包含了Strategy(策略接口)、ConcreteStrategy(具体策略类)和Context(上下文类)的实现。

策略接口Strategy

// Strategy.java  
public interface Strategy {  void executeStrategy();  
}

具体策略类

这里假设有两个具体策略类ConcreteStrategyAConcreteStrategyB

// ConcreteStrategyA.java  
public class ConcreteStrategyA implements Strategy {  @Override  public void executeStrategy() {  System.out.println("执行策略A");  // 策略A的具体实现  }  
}  // ConcreteStrategyB.java  
public class ConcreteStrategyB implements Strategy {  @Override  public void executeStrategy() {  System.out.println("执行策略B");  // 策略B的具体实现  }  
}

上下文类Context

它持有一个策略对象的引用,并提供了设置策略和执行策略的方法:

// Context.java  
public class Context {  private Strategy strategy;  // 构造函数  public Context(Strategy strategy) {  this.strategy = strategy;  }  // 设置策略  public void setStrategy(Strategy strategy) {  this.strategy = strategy;  }  // 执行策略  public void executeStrategy() {  strategy.executeStrategy();  }  
}

测试类

现在,我们可以编写一个示例来展示如何使用策略模式:

// StrategyPatternDemo.java  
public class StrategyPatternDemo {  public static void main(String[] args) {  // 创建策略对象  Strategy strategyA = new ConcreteStrategyA();  Strategy strategyB = new ConcreteStrategyB();  // 创建上下文对象并设置策略  Context context = new Context(strategyA);  context.executeStrategy(); // 输出:执行策略A  // 修改策略  context.setStrategy(strategyB);  context.executeStrategy(); // 输出:执行策略B  }  
}/* Output:
执行策略A
执行策略B
*///~

在这个示例中,Context类可以根据需要改变其内部持有的Strategy对象,从而改变其行为。

这是策略模式的核心思想:将算法的使用与算法的实现分离开来,使得算法可以独立于使用它的客户端变化。

策略模式的应用

策略模式是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。在软件系统中,策略模式使得算法可以独立于使用它的客户端变化。

策略模式的优点

  1. 算法自由切换:由于策略类实现了同一个接口,因此它们之间可以自由切换,这使得系统更加灵活和可维护。
  2. 易于扩展:当需要增加新的算法时,只需要实现该接口即可,符合开闭原则。
  3. 避免使用多重条件语句:使用策略模式可以避免在代码中出现大量的if-else语句,使代码更加清晰、简洁和易于维护。
  4. 提高算法的保密性和安全性:客户端只需要知道它使用了哪些算法,而不需要知道这些算法的具体实现细节,这有助于保护算法的安全性和保密性。

策略模式的缺点

  1. 客户端必须知道所有的策略类:客户端需要了解并决定使用哪一个策略类,这可能会增加客户端的复杂性。
  2. 可能造成策略类过多:当系统中存在大量的策略时,可能会导致策略类过多,增加了系统的复杂性。

策略模式的使用场景

  1. 计费系统:对于不同用户类型和消费金额采用不同的计费方式,可以使用策略模式来定义不同的计费策略。
  2. 游戏开发中的角色技能系统:不同角色拥有不同的技能,可以根据角色的选择使用不同的技能策略进行攻击或防御。
  3. 商城促销活动:根据不同的促销活动采取不同的优惠方式,如打折、满减等,策略模式可以方便地管理和切换这些优惠策略。
  4. 需要动态选择算法的场景:当系统中需要根据不同的条件选择不同的算法进行计算时,策略模式可以提供一个灵活的解决方案。

相关文章:

【设计模式深度剖析】【4】【行为型】【策略模式】

文章目录 策略模式定义英文原话直译 角色类图策略接口Strategy:具体策略类上下文类Context测试类 策略模式的应用策略模式的优点策略模式的缺点策略模式的使用场景 策略模式 策略模式(Strategy Pattern) Strategy策略也称作Policy政策。 想…...

opencv dnn模块 示例(26) 目标检测 object_detection 之 yolov10

文章目录 1、yolov10简要介绍1.1、双标签分配策略1.2、架构改进1.3、性能1.4、预训练模型1.5、网络有关层说明 2、测试2.1、官方测试2.2、opencv dnn2.2.1、仅运行到内部"NMS"步骤之前的层2.2.2、完整代码2.2.2、完整实现所有层 2.3、onnxruntime测试2.4、tensorrt 1…...

【python进阶】python图形化编程之美--tkinter模块初探

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

discuz点微同城源码34.7+全套插件+小程序前端

discuz点微同城源码34.7全套插件小程序前后端 模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序...

ActiveMQ 介绍、下载、安装和控制台

ActiveMQ 介绍 Apache ActiveMQ 是一款非常成熟且功能全面的开源消息中间件,由Apache软件基金会维护。它遵循 Java Message Service (JMS) 规范,这意味着它提供了一组标准的 API,允许 Java 应用程序以一种标准化的方式发送和接收消息。 以下…...

MacOS M系列芯片一键配置多个不同版本的JDK

第一步:下载JDK。 官网下载地址:Java Archive | Oracle 选择自己想要下载的版本,一般来说下载一个jdk8和一个jdk11就够用了。 M系列芯片选择这两个,第一个是压缩包,第二个是dmg可以安装的。 第二步:编辑…...

源码文章上传无忧,论坛小程序支持

前言 在数字化时代,知识的分享与传播显得愈发重要。为了满足广大创作者和求知者的需求,我们推出了全新的论坛小程序,不仅支持文章、源码、链接等多样化内容的上传,还实现了付费观看功能,为创作者们提供了一个展示才华…...

Docker面试整理-如何优化Docker容器的性能?

优化Docker容器的性能可以从多个方面入手,以下是一些建议: 选择合适的基础镜像:使用轻量级的基础镜像,如基于Alpine Linux的镜像,可以减少镜像的大小和启动时间。避免使用过于庞大的操作系统镜像。优化Dockerfile:减少Dockerfile中的不必要指令和层,以最小化镜像的大小。…...

list(二)和_stack_queue

嗨喽大家好,时隔许久阿鑫又给大家带来了新的博客,list的模拟实现(二)以及_stack_queue,下面让我们开始今天的学习吧! list(二)和_stack_queue 1.list的构造函数 2.设计模式之适配器和迭代器 3.新容器de…...

查询SQL02:寻找用户推荐人

问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析: 这题主要是要看这null值会不会用,如果说Java玩多了,你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…...

2、Tomcat 线程模型详解

2、Tomcat 线程模型详解 Tomcat I/O模型详解Linux I/O模型详解I/O要解决什么问题Linux的I/O模型分类 Tomcat支持的 I/O 模型Tomcat I/O 模型如何选型 网络编程模型Reactor线程模型单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程 Tomcat NIO实现Tomcat 异步IO实现 Tomc…...

对硬盘的设想:纸存、执行存

固态硬盘出现后,发现它的擦写次数受限,越是便宜的固态硬盘,擦写次数越少。于是,有了“纸存”的设想,即硬盘上的单元只能改写一次,就像拿钢笔在纸上写字一样。这时,文件系统、数据库该怎么设计&a…...

最新付会进群多群同时变现社群系统V3.5.3版本 详细教程+源码下载

市面1888最新付费进群多群同时变现系统V3.5.3版本 详细教程源码下载介绍: 续男粉变现,相亲群变现后 演化出来的最新多群同时变现系统 可同时进行40个群同时变现 可设置地域群,相亲,男粉变现等多种群 购买后包括详细的 域名服…...

python tk实现标签切换页面

import tkinter as tk from tkinter import ttk# 初始化主窗口 root tk.Tk() root.title("标签页示例")# 设置窗口大小 root.geometry("400x300")# 创建 Notebook 小部件 notebook ttk.Notebook(root) notebook.pack(expandTrue, fill"both")#…...

引擎:UI

一、控件介绍 Button 按钮 创建一个按钮 按钮禁用 精灵模式 颜色模式 缩放模式 绑定点击事件 EditBox 输入框 Layout 布局 支持水平排列、垂直排列、背包排列 PageView 页面视图 ProgressBar 进度条 RichText 富文本 绑定点击事件 事件可以被其它标签包裹 图文混排 Scroll…...

Redis常见异常及优化方案

Redis常见异常及优化方案 Redis集群(redis-cluster)中的三主三从或者哨兵(sentinel)模式配置是一种常见的高可用架构,用于解决单点故障和提高数据可靠性。然而,即使在这样的配置下,仍然可能会遇…...

YOLOV5 图像分割:利用yolov5进行图像分割

1、介绍 本章将介绍yolov5的分割部分,其他的yolov5分类、检测项目参考之前的博文 分类:YOLOV5 分类:利用yolov5进行图像分类_yolov5 图像分类-CSDN博客 检测:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 yolov5的分割和常规的分割项目有所区别,这里分割的结果…...

如何在Linux中使用Screen管理后台进程

如何在Linux中使用Screen管理后台进程 在Linux系统中,screen是一个非常有用的工具,它允许用户在一个终端窗口中创建多个虚拟终端,并且可以在这些终端之间切换,甚至可以在断开连接后重新连接到这些会话。这对于需要在后台运行长时…...

互联网轻量级框架整合之SpringMVC初始化及各组件工作原理

Spring MVC的初始化和流程 MVC理念的发展 SpringMVC是Spring提供给Web应用领域的框架设计,MVC分别是Model-View-Controller的缩写,它是一个设计理念,不仅仅存在于Java中,各类语言及开发均可用,其运转流程和各组件的应…...

【Android面试八股文】finally中的代码一定会执行吗?try里有return,finally还执行么?

文章目录 finally中的代码一定会执行吗?try里有return,finally还执行么?这道题想考察什么?考察的知识点考生应该如何回答验证特殊情况线程是守护线程遇到System.exit()finally中的代码一定会执行吗?try里有return,finally还执行么? 这道题想考察什么? 对Java语言的深…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...