设计模式——策略模式

设计模式——策略模式

  • 简单介绍
  • 一个例子

策略模式是设计模式里面比较简单的设计模式,其特点简单又实用,并且可以让你的代码看起来高大上,维护代码时还方便扩张

多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句

简单介绍

策略模式(Strategy Pattern)是一种行为设计模式,它在运行时选择算法或行为。它定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换。这样,算法的变化可以独立于使用算法的客户,这么说会有些抽象,下面会举个例子的

主要组成部分:

1,策略接口(Strategy Interface):定义了所有支持的算法的公共操作
2,具体策略类(Concrete Strategy Classes):实现了策略接口,提供了具体的算法实现
3,上下文(Context):持有一个策略对象的引用。使用策略对象来执行特定的算法

请添加图片描述

一个例子

我们举个例子来说明策略模式的必要性,现在有一个需求:我们需要做一个旅游平台,现在需要提供机票、火车票、酒店、门票等产品的下单、查询、退款接口,因为这些产品的行为都是类似的,所以我们不打算为他们分别提供接口,而是收口到一个 contrllor 中,我们先来看看使用 if else 去处理,会发生什么:

public class TravelService {@Resourceprivate FlightOrderService flightOrderService;@Resourceprivate TrainOrderService trainOrderService;@Resourceprivate HotelOrdeService hotelOrdeService;@Resourceprivate TicketOrdeService ticketOrdeService;public String placeOrder(String productType, Order order) {if ("flight".equals(productType)) {return flightOrderService.processFlightOrder(order);} else if ("train".equals(productType)) {return trainOrderService.processTrainOrder(order);} else if ("hotel".equals(productType)) {return hotelOrdeService.processHotelOrder(order);} else if ("ticket".equals(productType)) {return ticketOrdeService.processTicketOrder(order);} else {return "Unsupported product type";}}public String queryOrder(String productType, String orderId) {if ("flight".equals(productType)) {return flightOrderService.queryFlightOrder(orderId);} else if ("train".equals(productType)) {return trainOrderService.queryTrainOrder(orderId);} else if ("hotel".equals(productType)) {return hotelOrdeService.queryHotelOrder(orderId);} else if ("ticket".equals(productType)) {return ticketOrdeService.queryTicketOrder(orderId);} else {return "Unsupported product type";}}public String refundOrder(String productType, String orderId) {if ("flight".equals(productType)) {return flightOrderService.refundFlightOrder(orderId);} else if ("train".equals(productType)) {return trainOrderService.refundTrainOrder(orderId);} else if ("hotel".equals(productType)) {return hotelOrdeService.refundHotelOrder(orderId);} else if ("ticket".equals(productType)) {return ticketOrdeService.refundTicketOrder(orderId);} else {return "Unsupported product type";}}
}

可以看到上面代码有如下问题:

1,扩展性有限:如果我想要再引入动物园票啥的业务,我需要再额外写 else if(这里举的例子比较简单,改动起来比较简单,但是在实际的工程中,需要改动的地方太多了)
2,过多的 if else,会导致代码的甬余

改用策略模式后,我们再看看:

先提供一个抽象的策略接口,定义订单行为:

public interface OrderStrategy {String placeOrder(Order order);String queryOrder(String orderId);String refundOrder(String orderId);
}

写四个类实现订单接口:

public class FlightOrderStrategy implements OrderStrategy {@Overridepublic String placeOrder(Order order) {return "Flight order processed: " + order;}@Overridepublic String queryOrder(String orderId) {return "Flight order queried: " + orderId;}@Overridepublic String refundOrder(String orderId) {return "Flight order refunded: " + orderId;}
}public class TrainOrderStrategy implements OrderStrategy {@Overridepublic String placeOrder(Order order) {return "Train order processed: " + order;}@Overridepublic String queryOrder(String orderId) {return "Train order queried: " + orderId;}@Overridepublic String refundOrder(String orderId) {return "Train order refunded: " + orderId;}
}public class HotelOrderStrategy implements OrderStrategy {@Overridepublic String placeOrder(Order order) {return "Hotel order processed: " + order;}@Overridepublic String queryOrder(String orderId) {return "Hotel order queried: " + orderId;}@Overridepublic String refundOrder(String orderId) {return "Hotel order refunded: " + orderId;}
}public class TicketOrderStrategy implements OrderStrategy {@Overridepublic String placeOrder(Order order) {return "Ticket order processed: " + order;}@Overridepublic String queryOrder(String orderId) {return "Ticket order queried: " + orderId;}@Overridepublic String refundOrder(String orderId) {return "Ticket order refunded: " + orderId;}
}

上下文类:

public class TravelService {private OrderStrategy strategy;public TravelController(OrderStrategy strategy) {this.strategy = strategy;}public void setStrategy(OrderStrategy strategy) {this.strategy = strategy;}public String placeOrder(Order order) {return strategy.placeOrder(order);}public String queryOrder(String orderId) {return strategy.queryOrder(orderId);}public String refundOrder(String orderId) {return strategy.refundOrder(orderId);}
}

客户端代码

public class Client {public static void main(String[] args) {TravelController controller = new TravelController(new FlightOrderStrategy());Order order = new Order("12345", "Flight to Paris");System.out.println(controller.placeOrder(order)); // 输出: Flight order processed: Order{id='12345', description='Flight to Paris'}System.out.println(controller.queryOrder("12345")); // 输出: Flight order queried: 12345System.out.println(controller.refundOrder("12345")); // 输出: Flight order refunded: 12345// 动态更换策略controller.setStrategy(new HotelOrderStrategy());Order hotelOrder = new Order("67890", "Hotel in New York");System.out.println(controller.placeOrder(hotelOrder)); // 输出: Hotel order processed: Order{id='67890', description='Hotel in New York'}System.out.println(controller.queryOrder("67890")); // 输出: Hotel order queried: 67890System.out.println(controller.refundOrder("67890")); // 输出: Hotel order refunded: 67890}
}

以上,我们使用了策略模式分离算法和业务逻辑,将不同产品的处理逻辑分离到不同的策略类中,使代码更清晰、更易于维护

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【玩转 Postman 接口测试与开发2_018】第14章:利用 Postman 初探 API 安全测试

《API Testing and Development with Postman》最新第二版封面 文章目录 第十四章 API 安全测试1 OWASP API 安全清单1.1 相关背景1.2 OWASP API 安全清单1.3 认证与授权1.4 破防的对象级授权(Broken object-level authorization)1.5 破防的属性级授权&a…

MySQL的 MVCC详解

MVCC是多版本并发控制,允许多个事务同时读取和写入数据库,而无需互相等待,从而提高数据库的并发性能。 在 MVCC 中,数据库为每个事务创建一个数据快照。每当数据被修改时,MySQL不会立即覆盖原有数据,而是生…

【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据

一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址: https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动,会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…

UG NX二次开发(Python)-API函数介绍与应用实例(三)-UFLayer类操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1 前言2、UFLayer类说明3、获取当前工作图层4、移动对象到特定的图层1 前言 采用Python语言进行UG NX二次开发的帮助材料很少,采用录制的方法是一种比较容易实现的方式,但是使用UFun函数更容易上…

免费PDF 转换成 Word、PPT、Excel 格式的工具

在当今数字化办公的时代,文件格式的转换需求日益频繁。我们的软件应运而生,它是一款专业的 PDF 转换成 Word、PPT、Excel 格式的工具,为您的办公流程带来极大便利。 下载地址:https://pan.quark.cn/s/8c42ac2e4bf5 核心功能&…

deepseek从网络拓扑图生成说明文字实例

deepseek对话页面中输入问题指令: 我是安全测评工程师,正在撰写系统测评报告,现在需要对系统网络架构进行详细说明,请根据附件网络拓扑图输出详细说明文字。用总分的段落结构,先介绍各网络区域,再介绍网络…

排序算法--希尔排序

希尔排序是插入排序的改进版本,适合中等规模数据排序,性能优于简单插入排序。 // 希尔排序函数 void shellSort(int arr[], int n) {// 初始间隔(gap)为数组长度的一半,逐步缩小for (int gap n / 2; gap > 0; gap …

【NR-NTN】3GPP Release 18中NR-NTN过程描述

本文参考3GPP规范: 【1】《TS 38.300 V18.4.0 NR; NR and NG-RAN Overall Description; Stage2》 1. 概述 图1展示了一个非地面网络(NTN)的示例,通过NTN载荷和NTN网关为用户设备(UE)提供非地面NR接入。图…

python3中错误与异常初识

一. 简介 在 编写 Python时,经常会遇到一些报错信息。接下来开始学习 Python3 中错误和异常。 本文首先初步了解一下 Python3中的错误和异常。 二. python3 中错误与异常初识 Python 中有两种错误:语法错误与异常。 1. 语法错误 Python 的语法错误…

一文解释nn、nn.Module与nn.functional的用法与区别

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 …

“AI隐患识别系统,安全多了道“智能护盾”

家人们,在生活和工作里,咱们都知道安全那可是头等大事。不管是走在马路上,还是在工厂车间忙碌,又或是住在高楼大厦里,身边都可能藏着一些安全隐患。以前,发现这些隐患大多靠咱们的眼睛和经验,可…

口腔扫描仪(口扫)核心算法——点云三维重建

口腔扫描仪(口扫)的核心算法涉及三维点云获取、配准、去噪、补全及表面重建等多个技术环节,以下从技术原理、关键算法和应用挑战进行详细解析: 1. 数据采集与成像原理 口腔扫描的核心在于快速、高精度获取牙齿与软组织表面几何信…

VLL CCC远程连接实验

1、CE1和CE2的配置 CE1和CE2的配置很简单,只需要在接口E0/0/0上配置ip地址即可; 2、PE1的配置 配置CCC名称为CE1-CE2,将E0/0/1(连接CE1)作为入接口,入标签为100,出去的时候换成200&#xff0c…

讯飞智作 AI 配音技术浅析(四):语音特征提取与建模

语音特征提取与建模是讯飞智作 AI 配音技术的核心环节,旨在将文本信息转化为高质量的语音信号。该过程依赖于深度学习模型,通过对大量高质量语音数据的训练,提取出关键的声学特征(如音素、音节、语调、语速等)&#xf…

Java 大视界 -- Java 大数据在智能教育中的应用与个性化学习(75)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 一、…

【MySQL】centos 7 忘记数据库密码

vim /etc/my.cnf文件; 在[mysqld]后添加skip-grant-tables(登录时跳过权限检查) 重启MySQL服务:sudo systemctl restart mysqld 登录mysql,输入mysql –uroot –p;直接回车(Enter) 输…

Linux 源码编译安装httpd 2.4,提供系统服务管理脚本并测试

第一种方式 1. 下载 Apache HTTP Server 源代码 首先,从 Apache 官网 下载最新版本的 httpd 2.4 源码,或者直接使用 wget 下载: [rootlocalhost ~]# wget https://downloads.apache.org/httpd/httpd-2.4.36.tar.gz # 解压 [rootlocalhost ~…

【重生之学习C语言----杨辉三角篇】

目录 ​编辑 --------------------------------------begin---------------------------------------- 一、什么是杨辉三角? 二、问题分析 三、算法设计 使用二维数组存储杨辉三角: 递推关系: 格式化输出: 四、代码实现 完…

绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 本文主要介绍如何在绿联NAS中使用ssh远程连接后,使用一行代码快速安装cpolar内网穿透工具,轻松实现随时随地远程访问本地内网中的绿联NAS,无需公网…

C语言-----数据结构从门到精通

1.数据结构基本概念 数据结构是计算机中存储、组织数据的方式,旨在提高数据的访问和操作效率。它是实现高效算法和程序设计的基石。 目标:通过思维导图了解数据结构的知识点,并掌握。 1.1逻辑结构 逻辑结构主要四种类型: 集合:结构中的数据元素之…