【重温设计模式】策略模式及其Java示例

策略模式的基本概念

策略模式,是一种常见的行为设计模式,主要用于处理程序中的一些相同行为,但具有不同实现方式的问题。在策略模式中,我们将每一种行为封装为一个个策略类,通过策略类的组合和切换,可以灵活地改变程序的行为。

那么,我们为何需要使用策略模式呢?在很多情况下,我们的程序需要处理一些相似但又不完全相同的问题,例如,排序算法。我们可以使用冒泡排序、快速排序、堆排序等多种算法,这些算法的目标都是排序,但实现方式各有不同。如果我们将每种排序算法都封装成一个策略类,那么我们就可以在程序运行时根据需要,灵活地切换排序策略。

策略模式的结构主要由三部分组成:环境类(Context)、抽象策略类(Strategy)和具体策略类(ConcreteStrategy)。环境类封装了对策略的调用和策略的切换,抽象策略类定义了所有支持的算法的公共接口,具体策略类实现了抽象策略类定义的接口,并封装了具体的算法实现。

让我们通过一个简单的Java代码示例来进一步理解策略模式的结构组成:

// 抽象策略类
public interface SortingStrategy {
    void sort(int[] numbers);
}

// 具体策略类:冒泡排序
public class BubbleSortStrategy implements SortingStrategy {
    @Override
    public void sort(int[] numbers) {
        // 实现冒泡排序
        OneMore.bubbleSort(numbers);
    }
}

// 具体策略类:快速排序
public class QuickSortStrategy implements SortingStrategy {
    @Override
    public void sort(int[] numbers) {
        // 实现快速排序
        OneMore.quickSort(numbers);
    }
}

// 环境类
public class Sorter {
    private SortingStrategy strategy;

    public Sorter(SortingStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(SortingStrategy strategy) {
        this.strategy = strategy;
    }

    public void sort(int[] numbers) {
        strategy.sort(numbers);
    }
}
implements
implements
dependency
«interface»
SortingStrategy
+sort(int[] numbers)
BubbleSortStrategy
+sort(int[] numbers)
QuickSortStrategy
+sort(int[] numbers)
Sorter
-SortingStrategy strategy
+Sorter(SortingStrategy strategy)
+setStrategy(SortingStrategy strategy)
+sort(int[] numbers)

在接下来的部分,我们将通过一个Java实际案例,来展示策略模式在实际开发中的应用,以及其解决问题的能力。

策略模式的Java实际案例

在我们深入解析了策略模式的基本概念之后,让我们来看看策略模式在实际开发中的应用,以及其解决问题的能力。

在电子商务中,商品的促销策略是十分重要的一环。例如,我们可能会有满减策略,打折策略,赠品策略等等。这些策略根据不同的商品、时间、地点等因素,可能会有所不同。如果我们用传统的编程方式,可能需要写大量的if-else语句来处理各种情况,代码将会变得非常复杂和难以维护。

这时,我们可以利用策略模式来解决这个问题。首先,我们定义一个促销策略接口,然后为每种策略实现一个具体的类。当需要计算商品的促销价格时,我们只需要选择合适的策略类进行计算即可。

public interface PromotionStrategy {
    double doPromotion(double price);
}

public class DiscountStrategy implements PromotionStrategy {
    @Override
    public double doPromotion(double price) {
        return price * 0.8;
    }
}

public class FullReductionStrategy implements PromotionStrategy {
    @Override
    public double doPromotion(double price) {
        if (price > 100) {
            return price - 20;
        } else {
            return price;
        }
    }
}

public class OneMoreClass {
    private PromotionStrategy strategy;

    public OneMore(PromotionStrategy strategy) {
        this.strategy = strategy;
    }

    public double getPromotionPrice(double price) {
        return strategy.doPromotion(price);
    }
}

在这个例子中,我们可以看到,策略模式使得代码更加清晰,易于扩展和维护。

implements
implements
uses
«interface»
PromotionStrategy
+doPromotion(double price)
DiscountStrategy
+doPromotion(double price)
FullReductionStrategy
+doPromotion(double price)
OneMoreClass
-PromotionStrategy strategy
+OneMoreClass(PromotionStrategy strategy)
+getPromotionPrice(double price)

当我们需要添加新的促销策略时,只需要增加一个实现了PromotionStrategy接口的类即可,无需修改原有的代码。然而,策略模式并非万能的,它也有其优点与缺点,这将是我们下一步要探讨的内容。

策略模式的优点与缺点

在我们深入探讨策略模式的优点与缺点之前,让我们先回顾一下策略模式的定义。策略模式是一种行为设计模式,它使你能够在运行时切换对象中的算法或策略。这使得程序能够根据需要改变其行为,而无需改变其代码。在许多实际应用场景中,策略模式都发挥了重要的作用,比如我们之前提到的互联网电子商务项目。

策略模式的优点主要有两个。首先,策略模式可以避免使用多重条件选择语句。在传统的编程中,我们通常使用if-else或switch-case语句来处理不同的条件。然而,这样的代码往往难以维护和扩展。策略模式通过定义一系列的算法,将每个算法封装到具有共同接口的独立的类中,从而避免了多重条件选择语句。

其次,策略模式可以提高算法的复用性和灵活性。由于每个策略都被封装在独立的类中,因此可以在不同的程序中复用这些策略。此外,如果需要增加新的策略,只需要添加一个实现了策略接口的新类即可,不需要修改原有的代码。

然而,策略模式也有其缺点。其主要的缺点是客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这增加了客户端的复杂性,尤其是在策略类数量较多的情况下。此外,由于策略模式会产生许多策略类,如果未进行合理的组织和管理,可能会导致代码结构混乱。

总的来说,策略模式在需要根据不同条件执行不同算法,或者多个算法只在行为上稍有不同的情况下,使用最为合适。在这些情况下,策略模式可以提供一种灵活且可维护的解决方案。

总结

生活充满了选择,而这些选择往往会塑造我们的命运。策略模式就是这样一种设计模式,它帮助我们在面对多种算法或策略时,能够做出灵活的选择,而无需改变代码的结构。这种设计模式在很多实际的开发场景中都发挥了重要的作用。

策略模式的优点是显而易见的,它可以避免使用多重条件选择语句,提高算法的复用性和灵活性。然而,它也有其缺点,主要是客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这无疑增加了客户端的复杂性,尤其是在策略类数量较多的情况下。

然而,我们要明白,没有哪一种设计模式是完美的,它们都有自己的优点和缺点。选择使用哪一种设计模式,取决于我们所面临的具体问题和需求。策略模式是一种非常实用的设计模式,它提供了一种灵活且可维护的解决方案。但是,我们也应该注意到,策略模式并不能解决所有的问题,它只是我们工具箱中的一种工具,我们需要根据实际情况,灵活选择和使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据仓库的魅力及其在企业中的应用实践

数据仓库,这一创新性的概念来自于比尔恩门,从1980年代末提出以来,便凭借其独特的架构设计和强大的数据处理能力,在全球商业领域中掀起了一场革命。它不仅是解决企业海量数据存储和查询需求的关键技术,更是推动企业实现…

MYSQL数据库管理基本操作

一、数据库的基本操作 1、登录数据库 [rootmysql-server ~]#mysql -uroot -p123456 ###直接回车,则进入数据库[rootmysql-server ~]#mysql -u root -p ###直接回车 Enter password: ###输入密码 方法一&#xff1a…

第3关:创建零件表P,并插入数据

任务描述 零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。创建零件表P(PNO,PNAME,COLOR,WEIGHT),并在P表中插入下图数据。 相关知识 1、MySQL创建表的基本语法如下: 其中,table_name 是要创…

docker入门(六)—— docker镜像详细介绍,理解docker分层

docker 镜像详解 镜像本质是什么 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。 别人给我们生成好的一个环境&…

【黄金手指】windows操作系统环境下使用jar命令行解压和打包Springboot项目jar包

一、背景 项目中利用maven将Springboot项目打包成生产环境jar包。名为 prod_2024_1.jar。 需求是 修改配置文件中的某些参数值,并重新发布。 二、解压 jar -xvf .\prod_2024_1.jar释义: 这段命令是用于解压缩名为"prod_2024_1.jar"的Java归…

期刊如何反击一波可疑图像

出版商正在部署基于人工智能的工具来检测可疑图像,但生成式人工智能威胁着他们的努力。 期刊正在努力检测用于分析蛋白质和DNA的凝胶的操纵图像。图片来源:Shutterstock 似乎每个月都会有一系列针对研究人员的新高调指控,这些研究人员的论文…

软件的安装与卸载(YUM)

YUM:yum 是一个方便的"应用商店",你可以通过它轻松地安装、更新和删除软件包,就像从应用商店中下载和安装应用程序一样。(这个得用root身份,普通用户权限不够) 常用命令: 1.安装软件…

阿里云2核4G服务器支持多少人在线?2C4G多少钱一年?

2核4G服务器支持多少人在线?阿里云服务器网账号下的2核4G服务器支持20人同时在线访问,然而应用不同、类型不同、程序效率不同实际并发数也不同,2核4G服务器的在线访问人数取决于多个变量因素。 阿里云2核4G服务器多少钱一年?2核4…

python_django网红基地孵化园场地管理系统flask

作为一个管理孵化园的网络系统,数据流量是非常大的,所以系统的设计必须满足使用方便,操作灵活的要求。所以在设计孵化园管理系统管理系统应达到以下目标: (1)界面要美观友好,检索要快捷简易&…

3.20网络编程

练习: 1> 创建一个工人信息库,包含工号(主键)、姓名、年龄、薪资。 2> 添加三条工人信息(可以完整信息,也可以非完整信息) 3> 修改某一个工人的薪资(确定的一个&#xf…

应用改进SA算法实现MATLAB-HFSS交互仿真与天线优化

应用改进SA算法实现MATLAB-HFSS交互仿真与天线优化 第一章SA算法及其简单应用1.1 SA算法简介1.2 SA算法原理1.2.1 SA算法原理 1.3 Metropolis准则及退火过程中的参数控制1.3.1 Metropolis准则1.3.2退火过程中的参数控制 1.4 SA算法简单应用 第二章 改进SA算法2.1 改进方向2.2 改…

企业如何选择一个开源「好」项目?

开源 三句半 oss-roast 需求明确是关键 风险考量要周全 开源虽好不白捡 别忘合规! 显然,开源已成为一股不可阻挡的洪流,企业拥抱开源,积极参与开源项目不仅是响应技术潮流的必然选择,更是实现自身技术创新、市场拓展等…

新火种AI|国产手机抢滩“AI+折叠屏”赛道,行业洗牌大战就此开启?

作者:小岩 编辑:彩云 从2023年到2024年,随着新一波人工智能浪潮的加速,消费电子产品也迎来了全新的话题——AI。更重要的是,这场战争看似没有硝烟,但各大厂商都已经暗自角力了许久,特别是手机…

PHP全新美化广告横幅在线制作源码

源码简介 可以做网站的引流不需要安装上传就可以使用,在第一版基础上做了二次开发更加好用 注意:主机和服务器均可架设搭建,如果使用宝塔架设点击访问的时候提示找不到文件路径的时候,记得点击网站目录把防跨站攻击先关闭,这样就可以正常访问了,这款是…

华为openEuler系统卸载jdk

华为openEuler系统卸载jdk 1.查看openEuler上已安装的 Java 版本: 在终端中运行以下命令,查看系统中已经安装的 Java 版本。 sudo alternatives --config java这将列出已安装的 Java 版本,你可以看到当前使用的是哪个版本 2.卸载 Java&am…

java static

1、static概念 (1)static 关键字是静态的意思,可以修饰成员方法,成员变量 (2)static 修饰的特点 ① 被类的所有对象共享,这也是我们判断是否使用静态关键字的条件。 ② 可以通过类名调用&…

ActiViz三维场景的基本要素——相机

文章目录 前言一、基本属性和方法二、相机操作三、高级功能四、 示例代码和应用五、总结前言 在ActiViz中,vtkCamera是一个非常重要的类,用于定义观察场景的视角和位置。作为三维可视化的核心组件之一,vtkCamera决定了用户在三维场景中所看到的图像内容和视角,因此它对于呈…

Linux之文件管理与重定向

文件的管理 最开始说到过, 一个进程是可以打开多个文件的并且可以对这些文件做出不同的操作, 也就是说加载到内存中的文件可能存在多个. 操作系统要不要管理这些打开的文件呢? 当我们在程序里面打开多个文件时, 操作系统肯定是得对这些文件进行管理的, 而管理的本质就是对数…

openKylin系统安装ssh服务结合内网穿透实现固定公网地址访问

文章目录 1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接小结 6. 固定SSH公网地址7. SSH固定地址连接 openKylin是中国首个基于Linux 的桌面操作系统开发者平台,通过开放操作系统源代码的方式,打造具有自…

cnetos7将普通用户的权限提升为超级用户

将普通用户的权限提升为超级用户 现象:当我们初次使用sudo命令时,会遇到下面的问题 解决步骤: 显示你当前登录用户的用户名。 whoami将自己的用户切为超级用户,密码为你第一次使用Linux登录时的密码 su -使用vim编辑器打开配…