二十三种设计模式第十四篇--策略模式

news2024/11/25 21:34:15

策略模式:主要围绕一个类的行为或者其算法在运行时更改,也是一种行为型模式。

在软件开发中,我们经常遇到需要根据不同的情况选择不同算法或行为的情况。传统的做法是使用大量的条件语句来实现这种逻辑,但这样的实现方式往往难以维护和扩展。策略模式(Strategy Pattern)提供了一种优雅的解决方案,可以让我们灵活地处理多种算法和行为,同时提高代码的可维护性和可扩展性。

策略模式的意义

策略模式的主要目的是将算法的定义、实现和使用相互解耦,使得它们可以独立变化。它通过将不同的算法封装在独立的策略类中,并定义一个通用的接口或抽象类来统一它们的调用方式。这样一来,客户端只需要与通用接口交互,而不需要关心具体的算法实现细节。

策略模式的核心思想是将算法视为一个可互换的组件,客户端可以在运行时动态地选择适合的策略。这种灵活性使得策略模式特别适用于需要根据不同的条件或偏好来调整算法的情况。例如,一个电商平台可以根据用户的购买历史和偏好选择不同的优惠策略来计算商品的价格。

策略模式的实现

在策略模式中,我们通常会定义一个策略接口或抽象类,用于统一不同策略的调用方式。然后,针对每种具体的算法或行为,我们创建相应的策略类,实现策略接口,并提供具体的算法实现。

客户端在需要使用算法的地方,通过策略接口与具体的策略类进行交互。客户端可以根据实际需求,在运行时动态地选择合适的策略类,并将其注入到上下文对象中。上下文对象负责调用所选策略的算法,并返回结果给客户端。

这种结构使得我们可以灵活地添加新的策略类或修改现有的策略类,而不会对客户端代码产生影响。策略模式将算法的变化对客户端透明,使得客户端只需要关注业务逻辑,而不需要关心具体的算法实现。

策略模式的优点

使用策略模式可以带来多个优点:

  1. 灵活性和可扩展性:策略模式通过将算法封装在独立的策略类中,使得可以在运行时动态地选择和切换算法,而无需修改客户端的代码。这种灵活性使得系统更容易扩展和适应变化。
  2. 可维护性:策略模式将不同的算法或行为封装在独立的策略类中,使得代码结构清晰,易于理解和维护。每个策略类负责实现一个特定的算法,修改或调试一个策略对其他策略没有影响,降低了代码的复杂性。
  3. 代码复用:策略模式可以促进代码的复用。不同的策略类可以共享相同的接口或抽象类,从而使得相似的算法可以通过继承或实现来共享代码。这样可以避免代码的重复编写,提高开发效率。

策略模式的应用场景

策略模式在以下情况下特别适用:

  1. 当需要根据不同的条件或偏好选择不同算法或行为时,可以使用策略模式来灵活地切换和调整算法。

  2. 当有多个相似的算法或行为,但它们的实现细节不同,可以将每个算法封装在独立的策略类中,以提高代码的可读性和可维护性。

  3. 当某个算法的实现经常变化,或者希望在运行时动态地选择算法时,可以使用策略模式来避免频繁修改客户端的代码。

  4. 当需要将算法的定义、实现和使用相互解耦,以提高代码的模块化和可测试性时,策略模式也是一个很好的选择。

代码实现

在这里插入图片描述

public interface Strategy {

   public int doOperation(int num1, int num2);

}
public class OperationAdd implements Strategy {
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}
public class OperationMultiply implements Strategy {
   @Override
   public int doOperation(int num1, int num2) {
      return num1 * num2;
   }
}
public class OperationSubtract implements Strategy {
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}
public class Context {
   //真实采用的策略
   private Strategy strategy;
 
   public Context(Strategy strategy){
      this.strategy = strategy;
   }
 
   public int executeStrategy(int num1, int num2){

      return strategy.doOperation(num1, num2);
   }


}
public class StrategyPatternDemo {
   public static void main(String[] args) {

      Context context = new Context(new OperationAdd());    
      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
 
      context = new Context(new OperationSubtract());      
      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
 
      context = new Context(new OperationMultiply());    
      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
   }
}

结论

策略模式是一种优秀的设计模式,它能够灵活地处理多种算法和行为,提高代码的可维护性、可扩展性和可测试性。通过将算法封装在独立的策略类中,并通过统一的接口来调用,我们可以使得算法的变化对客户端透明,从而降低了代码的耦合性。策略模式的应用可以让我们的代码更加灵活、可读和可维护,是值得推广和应用的一种设计模式。

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

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

相关文章

Numpy学习(参考)

目录 一、前言 二、numpy官方文档 文档划分 参数规范 相关知识明知 Routines学习(部分) 1、创建 2、数组操作常用 ufunc 三、numpy基本操作 开篇探索 数据类型 创建数组 创建数组有5种常规机制 常用创建方法 拷贝创建 数组运算 形状操作 查看形状 形状变换 …

第124天:内网安全-代理技术Socks协议路由不出网后渗透通讯CS-MSF上线

知识点 #知识点: 1、代理软件使用-Win&Linux 2、代理协议使用-Socks4/5 3、CS&MSF-网络通讯&控制上线-隧道技术:解决不出网协议上线的问题(利用出网协议进行封装出网) -代理技术:解决网络通讯不通的问题&…

MySQL数据库------------数据库的安装-----开始步入梦想

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————————— 这一篇文章主要讲解一下MySQL的下载 数据库MySQL 这是 CentOS7 的 mysql 安装,如果有其他版本的需求&#xff…

C++ 环境设置

本地环境设置 如果您想要设置 C 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C 编译器。 文本编辑器 这将用于输入您的程序。文本编辑器包括 Windows Notepad、OS Edit command、Brief、Epsilon、EMACS 和 vim/vi。 文本编辑器的名…

tqdm笔记

目录 tqdm笔记导入显示进度条与enumerate一起使用 tqdm报错tqdm在notebook里每次刷新增加一行 tqdm笔记 导入 from tqdm import tqdm显示进度条 for i in tqdm(range(100)):time.sleep(0.01)与enumerate一起使用 a list(range(100)) for i, j in enumerate(tqdm(a)):time.…

Windows系统封装教程

一、封装前准备工作 虚拟机软件:VMware Workstation Pro windows镜像:windows 10.iso PE镜像:微PE.iso (微PE工具箱) 工具包:软媒魔方 封装工具:sysceo(SC封装工具3.0&#xff…

java模拟面试题1

1、哪些问题是HTTPS无法解决的? Http是基于TCP协议的,在网络层的传输耗时比较长,https没有解决这个问题;http头是不能压缩的,每次要传递很大的数据包,每个连接也只能支持一个请求。同时https应用了很多加密…

IP地址定位在移动通信中的应用

根据IP地址定位技术在移动通信中的应用越发广泛。这项技术通过将用户的IP地址与地理位置信息相结合,为移动通信提供了更准确的定位服务。在这一创新中,移动通信运营商使用了IP地址定位技术以便更好地为用户提供定位服务、推送个性化广告以及提高安全性。…

数学建模常用模型(四):灰色关联分析法

数学建模常用模型(四):灰色关联分析法 灰色关联分析法(Grey Relational Analysis,GRA)是一种用于多指标决策评价的方法,由灰色系统理论发展而来。它用于分析和评价多个指标之间的相关性和影响程…

【Python】矩阵乘法3种实现方案

结论: 1、 符在numpy里就是矩阵乘法的意思,也是dot()的意思。 2、用这个 运算符可以不用再使用matmult方法 3、一般来说, 比.dot()方法要慢一点点。dot是numpy里的函数,主要用于求向量相乘,矩阵乘法,矩…

vue通过mixins混入实现所有大屏适配,摆脱因适配引起的头痛(模版就是设计稿->全程就是px)

vue通过mixins混入实现所有大屏适配 市场上屏幕种类繁多,自己开发MAC的版本显示器1440900与另一个显示屏的全屏状态下是19201080,如何让自己的web项目,在不同的宽高比下依旧体现出高优越的观感体验。。。。 rem响应式单位:好用但是设计稿不…

ChatLaw:中文法律大模型

论文题目:ChatLaw: Open-Source Legal Large Language Model with Integrated External Knowledge Bases   论文日期:2023/06/28   官网地址:https://www.chatlaw.cloud   论文地址:https://arxiv.org/abs/2306.16092   G…

【Ubuntu】Ubuntu制作Ubuntu Server系统盘

要制作 Ubuntu Server 系统盘,你可以按照以下步骤在 Ubuntu 系统上进行操作: 下载 Ubuntu Server ISO 镜像文件: 访问 Ubuntu 官方网站的下载页面:Get Ubuntu Server | Download | UbuntuGet Ubuntu Server one of three ways; by…

数据库操作

数据库操作作业 1.创建数据库,删除数据库,查询创建数据的语句,使用数据库,查询当前默认的数据库以及使用的编码方式校验规则 创建数据库 CREATE DATABASE 数据库名称 CHARACTER SET 字符集 COLLATE 校验规则; create database…

操作系统实战45讲|01程序的运行过程、02几行汇编几行C

配置环境遇到的问题 virtualBox实现windows和Ubuntu之间的复制粘贴 1.修改设置,设置共享粘贴板为双向 或者在运行的虚拟机的窗口中进行设置 2.安装virtualbox增强功能 (1)直接联网安装 设备----安装增强功能 3.补充 windows中终端和文档复制的快捷键为ctrlc&…

flashplayer timeout 15s

Error: Error #1502: 脚本的执行时间已经超过了 15 秒的默认超时设置。at mx.core::Container/http://www.adobe.com/2006/flex/mx/internal::getScrollableRect()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:4209]at mx.core::Container/cre…

自然语言处理:了解循环神经网络RNN及其变种长短期记忆网络(LSTM)、门控循环单元(GRU)、双向RNN

文章目录 一、RNN二、GRU三、LSTM四、GRU vs LSTM五、双向RNN 一、RNN 递归神经网络(Recurrent Neural Network,RNN)是一种具有时间序列依赖性的人工神经网络结构。其主要原理是在传统神经网络的基础上引入了循环连接,允许信息在…

基于51单片机温湿度-烟雾-一氧化碳-蓝牙-风扇的设计与实现

功能介绍 以51单片机作为主控系统;LCD1602液晶显示屏来显示显示测得的值;一氧化碳感应一氧化碳的数值;通过烟雾传感器获取前的烟雾值;通过DHT11温湿度传感器来获取当前的温湿度;当温度或烟雾高于阈值打开风扇&#xff…

折叠屏手机再添新功能?OPPOColorOS14发布,打通 App 和终端互联

近年来,多终端互联互通已经成为数码产品的发展趋势,各家手机品牌也在不断提升相关功能。 根据数码博主 数码闲聊站的爆料,OPPO即将发布ColorOS 14,并特别提供了针对折叠屏手机的Fold系统。该系统在横屏模式下对自带应用进行了更好…

工程项目综合管理系统拥有哪些功能,你真的了解吗?

在建筑工程行业中,项目的管理是一项复杂而又关键的任务。为了提高项目管理的效率和准确性,许多企业开始采用信息化系统进行精细化管理。因此,建立一套完善的工程项目管理系统,成为了建筑工程管理的必要条件之一。这种系统结合了工…