23种策略模式之策略模式

文章目录

    • 前言
    • 优缺点
    • 使用场景
    • 角色定义
    • UML
    • 模拟示例
    • 小结

前言

在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(Strategy Pattern)是其中一种常见的设计模式,它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用。

策略模式与其他设计模式有一些明显的区别。与模板方法模式相比,策略模式强调算法的灵活性,允许在运行时切换不同的策略。与状态模式相比,策略模式更注重不同算法之间的替换性,而非状态的内部转换。

优缺点

优点
策略类之间相互独立,易于扩展和维护。

可以在运行时动态切换策略,灵活性高。

提供了一种可替代继承的方案,避免继承层次的臃肿。

缺点
客户端需要了解不同的策略类,增加了使用的复杂度。

策略模式增加了类的数量,可能会导致系统更加庞大。

使用场景

如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
一个系统需要动态地在几种算法中选择一种
如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现
如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题

角色定义

  • 策略Context(上下文)

策略模式定义上下文角色本意是为了通过不同策略对象让上下文调用对应的算法或行为。

  • 策略抽象

策略抽象主要设定行为,定义策略需要具有哪些行为。

  • 策略实现

具体策略的实现,实现策略抽象行为具体细节。

UML

在这里插入图片描述

  • FruitMarket(策略抽象)
  • PapayaPeddler、KiwifruitPeddler、WatermelonPeddler(策略算法实现)
  • SellFruitsContext(策略Context)

模拟示例

//卖水果策略 上下文
public class SellFruitsContext{
	//水果市场策略抽象
    private FruitMarket fruitMarket;

    public SellFruitsContext() {
    }

    public SellFruitsContext(FruitMarket fruitMarket) {
        this.fruitMarket = fruitMarket;
    }
    //调用策略方法
    public void sellFruit(){
        this.fruitMarket.sellFruits();
    }
}
//水果市场 策略抽象
public interface FruitMarket {
    void sellFruits();
}
//策略实现者
public class KiwifruitPeddler implements FruitMarket {
    public void sellFruits() {
        System.out.println("卖猕猴桃咯,保熟!!");
    }
}

public class PapayaPeddler  implements FruitMarket {
    public void sellFruits() {
        System.out.println("卖木瓜咯,瓜保熟!!");
    }
}

public class WatermelonPeddler implements FruitMarket {
    public void sellFruits() {
        System.out.println("卖西瓜咯,瓜保熟!!");
    }
}
//定义类型枚举 通过 类型获取 对应的策略算法
public enum FruitEnum {
   KIWIFRUIT(1,KiwifruitPeddler.class),PAPAYA(2,PapayaPeddler.class),WATERMELON(3,WatermelonPeddler.class);
   //水果类型
    private Integer fruitType;
    //水果类型对应的策略算法
    private Class c;

    FruitEnum() {
    }

    FruitEnum(Integer fruitType, Class c) {
        this.fruitType = fruitType;
        this.c = c;
    }
    public FruitEnum getFruitEnumByType(Integer fruitType){
        for (FruitEnum value : FruitEnum.values()) {
            if(value.fruitType==fruitType)
                return value;
        }
        return null;
    }
}

小结

通过类型在枚举类获取对应策略算法实现类,将策略算法实现类传入策略上下文,通过策略上下文调用具体的策略算法。后期业务扩展可新增枚举数据添加策略算法实现类,完成对扩展业务的实现。

策略模式在代码重构的时候是很常见的,减少大量if else代码、增强代码扩展性、策略算法的灵活切换、避免单个条件重复判断,很多情况选择switch以及if else会比较多,但是随着业务复杂度业务代码量上来了,随之代码的扩展性以及可读性降低代码也显得极其臃肿,虽说对于每一种算法都要为其建立一种策略类,相对比较懒的程序员更愿意写if else,有时候也不要觉得策略算法实现类太多,因为策略算法的多少取决于你的业务复杂度,正是因为策略算法很多才体现出业务的复杂,才更需要用好策略模式。

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

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

相关文章

【数据库】数据库多种锁模式,共享锁、排它锁,更新锁,增量锁,死锁消除与性能优化

多种锁模式的封锁系统 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会…

RedisTemplate操作哈希数据

RedisTemplate操作哈希数据 概述常用方法添加哈希数据添加hashMap值判断hashkey 获取哈希数据获取属性值获取hashMap值。获取键值对。获取map键是否有值判断是否有map键。获取键。获取长度。集合方式获取值。匹配获取键值对 自增以double值大小自增。以long值大小自增。 修改删…

流程画布开发技术方案归档(G6)

🎨 在理想的最美好世界中,一切都是为最美好的目的而设。 —— 伏尔泰 如果可以实现记得点赞分享,谢谢老铁~ 一、技术选型 •从可维护性和可拓展性出发 •基本满足 1:链接: https://github.com/hukaibaihu/vue-org…

伦茨科技宣布ST17H6x芯片已通过Apple Find My「查找」认证

深圳市伦茨科技有限公司(以下简称“伦茨科技”)发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家,该平台提供可通过Apple Find My认证的Apple查找(Find My)功能集成解决方案。…

MPEG4Extractor

1、readMetaData 必须要找到 Moov box,找到 Mdat box或者 Moof box,并且创建了 ItemTable 大端 box 分为 box header 和 box content: box header由8个字节组成,前面四个字节表示这个box 的大小(包含这个头的8字节&a…

MySQL数据库,子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询。很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。 例&#…

微信小程序适配方案:rpx(responsive pixel响应式像素单位)

小程序适配单位:rpx 规定任何屏幕下宽度为750rpx 小程序会根据屏幕的宽度自动计算rpx值的大小 Iphone6下:1rpx 1物理像素 0.5css 小程序编译后,rpx会做一次px换算,换算是以375个物理像素为基准,也就是在一个宽度…

通用基础模型+提示词是否能胜过微调模型?医学案例研究

论文链接在末尾 摘要 通用基础模型,如GPT-4,在各种领域和任务中展现出令人惊讶的能力。然而,普遍存在这样一种假设,即它们在没有专业知识深度训练的情况下无法达到专业能力。例如,迄今为止对医学竞赛基准的大多数探索都利用了领域特定的训练,正如在BioGPT和Med-PaLM等项…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(二)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理1)数据介绍2)数据测试3)数据处理 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客,在读者…

ooTD I 这么精致优雅的套装也太好看了吧

精致到每一个细节的国风套装 领口袖口拼接环保毛条 精美的绣花增添浓重的高级感 外套90白鸭绒填充 敲暖和裙子的门襟处 也是做了定制盘扣,外套和裙子单独来穿也很精致

章鱼网络进展月报 | 2023.11.1-11.30

章鱼网络大事摘要 1、2023年12月,Octopus 2.0 将会正式启动。 2、隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态。 3、Louis 受邀作为嘉宾,在 NEARCON2023 的多链网络主题沙龙中发言:我们依然处于区…

主存储器与CPU的连接

目录 一. 单块存储芯片与CPU的连接二. 多块存储芯片与CPU的连接2.1 位扩展2.2 字扩展2.3 字位扩展 三. 译码器知识点的补充 \quad 一. 单块存储芯片与CPU的连接 \quad \quad \quad 暴露出的引脚都是与CPU连接的 上面这个是88位的存储芯片 我们可以看到有8个字, 每个字的字长是8…

Git提交代码时出现: ‘LF will be replaced by CRLF the next time Git touches it‘

遇到的问题 windows平台进行 git add 时,控制台打印警告 问题分析 1. Dos/Windows平台默认换行符:回车(CR)换行(LF),即’\r\n’ 2. Mac/Linux平台默认换行符:换行(LF&…

imazing正在查找最新的apple mobile device组件

​ Apple Mobile Device是macOS的一个组件,它允许您在Mac上与iOS设备进行无缝连接和通信。因此,无法直接在苹果设备上下载和安装Apple Mobile Device,需要借助管理工具进行下载安装后启动。 如果您需要与iOS设备进行通信和同步,…

javascript实现Stack(栈)数据结构

上一篇文章我们理解了List这种数据结构,知道了它的特点和一些使用场景,这篇文章我们就来看一下栈这种数据结构,这里的栈可不是客栈哦,哈哈 栈其实和List非常像,使用javascript实现都是基于数组来实现 尝试理解Stack …

10 大 Android 手机系统修复软件深度评测

您的新 Android 手机可能因其令人兴奋的性能而印象深刻。然而,随着时间的推移,您可能会发现系统有些地方与以前不太一样。您可能会遇到屏幕无响应、 Android应用程序崩溃、连接问题、电池耗尽等现象。 10 大 Android 手机系统修复软件 好吧,…

【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用,使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…

【数据结构和算法】--- 栈

目录 栈的概念及结构栈的实现初始化栈入栈出栈其他一些栈函数 小结栈相关的题目 栈的概念及结构 栈是一种特殊的线性表。相比于链表和顺序表,栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的…

LeetCode力扣每日一题(Java):26、删除有序数组中的重复项

一、题目 二、解题思路 1、我的思路 我一开始的思路是创建一个ArrayList对象,然后将数组中的元素追加到ArrayList中,再通过ArrayList提供的API去解题,但是发现题目中提到了原地删除重复的元素,所以这种方法是行不通的 那就只能…

智能优化算法应用:基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.袋獾算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…