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

设计模式再探——策略模式

目录

  • 一、背景介绍
  • 二、思路&方案
  • 三、过程
    • 1.策略模式简介
    • 2.策略模式的类图
    • 3.策略模式代码
    • 4.策略模式还可以优化的地方
    • 5.策略模式的例子改造(配置文件+反射)
  • 四、总结
  • 五、升华

一、背景介绍

最近在做产品的过程中,对于主题讨论回复内容,按照追评次数排序、点赞排序、时间排序等内容做了深入研究,通过策略模式可以很好的进行优化。

二、思路&方案

  • 1.策略模式简介
  • 2.策略模式的类图
  • 3.策略模式代码
  • 4.策略模式还可以优化的地方
  • 5.策略模式的例子改造

三、过程

1.策略模式简介

策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

2.策略模式的类图

在这里插入图片描述

3.策略模式代码

package mark.strategy;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:44*/
public abstract class Strategy {public abstract void Algorithmlnterface();
}
package mark.strategy;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:46*/
public class ConcreteStrategyA extends Strategy{@Overridepublic void Algorithmlnterface() {System.out.println("算法A的具体实现");}
}
package mark.strategy;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:47*/
public class ConcreteStrategyB extends Strategy{@Overridepublic void Algorithmlnterface() {System.out.println("算法B的具体实现");}
}
package mark.strategy;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:47*/
public class ConcreteStrategyC extends Strategy{@Overridepublic void Algorithmlnterface() {System.out.println("算法C的具体实现");}
}
package mark.strategy;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:45*/
public class Context {private Strategy strategy;Context(Strategy strategy){this.strategy = strategy;}public void ContextInterafce(){strategy.Algorithmlnterface();}
}
package mark.strategy;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:48*/
public class Client {public static void main(String[] args) {Context context;context = new Context(new ConcreteStrategyA());context.ContextInterafce();context = new Context(new ConcreteStrategyB());context.ContextInterafce();context = new Context(new ConcreteStrategyC());context.ContextInterafce();}
}

4.策略模式还可以优化的地方

策略模式后续进行策略的扩充,需要修改客户端代码;对于客户端而言未满足开闭原则。

5.策略模式的例子改造(配置文件+反射)

package mark.strategy.transform;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:44*/
public abstract class Strategy {public abstract void Algorithmlnterface();
}
package mark.strategy.transform;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:46*/
public class ConcreteStrategyA extends Strategy {@Overridepublic void Algorithmlnterface() {System.out.println("算法A的具体实现");}
}
package mark.strategy.transform;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:47*/
public class ConcreteStrategyB extends Strategy {@Overridepublic void Algorithmlnterface() {System.out.println("算法B的具体实现");}
}
package mark.strategy.transform;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:47*/
public class ConcreteStrategyC extends Strategy {@Overridepublic void Algorithmlnterface() {System.out.println("算法C的具体实现");}
}
package mark.strategy.transform;import java.util.HashMap;
import java.util.Map;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:45*/
public class Context {//将这个数据放到配置文件中static Map<String,String> config = new HashMap<>();static Map<String,Strategy> configBean = new HashMap<>();static {config.put("strategyA","mark.strategy.transform.ConcreteStrategyA");config.put("strategyB","mark.strategy.transform.ConcreteStrategyB");config.put("strategyC","mark.strategy.transform.ConcreteStrategyC");//预加载提前做好的策略for (Map.Entry<String,String> entry:config.entrySet()) {Class strategyClass = null;try {strategyClass = Class.forName(entry.getValue());configBean.put(entry.getKey(),(Strategy)strategyClass.newInstance());} catch (Exception e) {throw new RuntimeException(e);}}}private Strategy strategy;Context(String type){try {if(configBean.containsKey(type)){this.strategy = configBean.get(type);}else {Class strategyClass = Class.forName(config.get(type));this.strategy = (Strategy)strategyClass.newInstance();}} catch (Exception e) {throw new RuntimeException(e);}}public void ContextInterafce(){strategy.Algorithmlnterface();}
}
package mark.strategy.transform;/*** 功能描述:** @Author:makang* @Date: 2021/5/29 14:48*/
public class Client {public static void main(String[] args) {Context context;//前端通过下拉框选择不同的类型;下拉框中的值,也是通过配置文件进行读取的context = new Context("strategyA");context.ContextInterafce();context = new Context("strategyB");context.ContextInterafce();context = new Context("strategyC");context.ContextInterafce();}
}

四、总结

1.通过知识的综合运用,使得软件工程落地更加明确
2.何时使用策略:单一入口,单一出口的情况下;内部需要根据不同条件进行不同策略执行的时候使用
3.对策略模式概念的深度理解:算法家族=Strategy父类、分别封装起来=子类、让它们之间可以相互替换,算法的变化=多态、不会影响到使用算法的客户端=客户端满足开闭原则但是不太彻底

五、升华

原则是用来严格遵守的,变是永远不变的。

相关文章:

设计模式再探——策略模式

目录 一、背景介绍二、思路&方案三、过程1.策略模式简介2.策略模式的类图3.策略模式代码4.策略模式还可以优化的地方5.策略模式的例子改造(配置文件反射) 四、总结五、升华 一、背景介绍 最近在做产品的过程中&#xff0c;对于主题讨论回复内容&#xff0c;按照追评次数排…...

基于Googlenet深度学习网络的人员行为动作识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1. 原理 1.1 深度学习与卷积神经网络&#xff08;CNN&#xff09; 1.2 GoogLeNet 2. 实现过程 2.1 数据预处理 2.2 构建网络模型 2.3 数据输入与训练 2.4 模型评估与调优 3. 应用领域…...

存储过程的学习

1&#xff0c;前言 这是实习期间学习的&#xff0c;我可能是在学校没好好听课&#xff0c;&#xff08;或者就是学校比较垃&#xff0c;没教这部分&#xff0c;在公司经理让我下去自己学习&#xff0c;太难了&#xff0c;因为是公司代码很多部分都是很多表的操作&#…...

zookeeperAPI操作与写数据原理

要执行API操作需要在idea中创建maven项目 &#xff08;改成自己的阿里仓库&#xff09;导入特定依赖 添加日志文件 上边操作做成后就可以进行一些API的实现了 目录 导入maven依赖&#xff1a; 创建日志文件&#xff1a; 创建API客户端&#xff1a; &#xff08;1&#xff09…...

防火墙对双通道协议的处理

防火墙是一种网络安全设备或软件&#xff0c;用于控制网络流量并保护计算机网络免受未经授权的访问、恶意攻击和网络威胁。它作为网络的第一道防线&#xff0c;用于监视、过滤和管理进出网络的数据包。 防火墙可以基于预设的安全策略对网络流量进行评估和筛选。它通过比较数据…...

vscode搭建c语言环境问题

c语言环境搭建参考文章:【C语言初级阶段学习1】使用vscode运行C语言&#xff0c;vscode配置环境超详细过程&#xff08;包括安装vscode和MinGW-W64安装及后续配置使用的详细过程&#xff0c;vscode用户代码片段的使用&#xff09;[考研专用]_QAQshift的博客-CSDN博客 问题如下:…...

全网最全的接口自动化测试教程

为什么要做接口自动化 相对于UI自动化而言&#xff0c;接口自动化具有更大的价值。 为了优化转化路径或者提升用户体验&#xff0c;APP/web界面的按钮控件和布局几乎每个版本都会发生一次变化&#xff0c;导致自动化的代码频繁变更&#xff0c;没有起到减少工作量的效果。 而…...

数据结构----结构--线性结构--链式存储--链表

数据结构----结构–线性结构–链式存储–链表 1.链表的特点 空间可以不连续&#xff0c;长度不固定&#xff0c;相对于数组灵活自由 搜索&#xff1a; 时间复杂度O(n) 增删: 头增头删时间复杂度O(1) 其他时间复杂度为O(n) 扩展&#xff1a;单向循环链表的特性 从任意节…...

【5G 核心网】5G 多PDU会话锚点技术介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…...

K8s环境下监控告警平台搭建及配置

Promethues是可以单机搭建的&#xff0c;参考prometheus入门[1] 本文是就PromethuesGrafana在K8s环境下的搭建及配置 Prometheus度量指标监控平台简介 启动minikube minikube start 安装helm 使用Helm Chart 安装 Prometheus Operator: helm install prometheus-operator stabl…...

微信小程序在使用vant组件库时构建npm报错

在跟着vant官方进行使用步骤一步步操作时&#xff0c;由于要构建NPM&#xff0c;但NPM包在App配置文件的外部 所以在做下图这一步时&#xff1a; 接着再进行npm构建时会报错 message:发生错误 Error: F:\前端学习\前端框架\小程序\project\demo\miniprogram解决方法 &#xf…...

Django实现音乐网站 ⑽

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是后台对歌曲类型、歌单功能原有功能进行部分功能实现和显示优化。 目录 歌曲类型功能优化 新增编辑 优化输入项标题显示 父类型显示改为下拉菜单 列表显示 父类型显示名称 过滤器增加父类型 歌单表功能优化…...

SpringMVC的架构有什么优势?——异常处理与文件上传(五)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

【java面向对象中static关键字】

提纲 static修饰成员变量static修饰成员变量的应用场景static修饰成员方法static修饰成员方法的应用场景static的注意事项static的应用知识&#xff1a;代码块static的应用知识&#xff1a;单例设计模式 static静态的意思&#xff0c;可以修饰成员变量&#xff0c;成员方法&a…...

系统学习Linux-Redis集群

目录 一、Redis主从复制 概念 作用 缺点 流程 二、Reids哨兵模式&#xff08;sentinel&#xff09; 概念 作用 缺点 结构 搭建 三、redis集群 概述 原理 架构细节 选举过程 实验环境模拟 一、Redis主从复制 概念 是指将一台Redis服务器的数据&#xff0c;复制…...

【每日随笔】帝王心术 ② ( 如何培养下一代 | 重点培养孩子某一项特长 | 价值观培养 | 独立思考 | 人性和谋略教育 | 资源传承 | 人生指引 )

文章目录 一、重点培养孩子某一项特长二、价值观培养三、独立思考四、人性和谋略教育五、资源传承六、人生指引 一、重点培养孩子某一项特长 很多人 作为 父母 , 教育孩子 , 没有出息的占大多数 ; 父母 教育 孩子 , 给孩子培训 , 一般都给报个兴趣班 , 如果兴趣班的种类超过两…...

Git简介

Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同&#xff0c;它采用了分布式版本库的方式&#x…...

STM32入门学习之定时器输入捕获

1.定时器的输入捕获可以用来测量脉冲宽度或者测量频率。输入捕获的原理图如下&#xff1a; 假设定时器是向上计数。在图中&#xff0c;t1~t2之间的便是我们要测量的高电平的时间(脉冲宽度)。首先&#xff0c;设置定时器为上升沿捕获&#xff0c;如此一来&#xff0c;在t1时刻可…...

贪心算法:基础入门篇

贪心算法&#xff1a;基础入门篇 文章目录&#xff1a; 贪心算法&#xff1a;基础入门篇一、认识贪心算法二、常见贪心问题2.1 纸牌问题2.2 背包问题&#xff08;基础版&#xff09;2.3 简单数学证明问题 三、总结 一、认识贪心算法 在求最优解的问题中&#xff0c;以某种贪心…...

【Windows10下启动RocketMQ报错:找不到或无法加载主类 Files\Java\jdk1.8.0_301\lib\dt.jar】解决方法

Windows10下启动RocketMQ报错&#xff1a;找不到或无法加载主类 一、问题产生二、产生原因三、解决办法 一、问题产生 参考RocketMQ Github官网上的说明&#xff0c;下载rocketmq-all-5.1.3-bin-release.zip&#xff0c;解压配置环境变量后&#xff0c;执行如下命令&#xff1a…...

篇章一 论坛系统——前置知识

目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构​编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...

RFID推动新能源汽车零部件生产系统管理应用案例

RFID推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域&#xff0c;电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式&#xff0c;存在单点位单独头溯源、网关布线…...

Xcode 16.2 版本 pod init 报错

Xcode 版本升级到 16.2 后&#xff0c;项目执行 pod init 报错&#xff1b; ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchron…...

【Go语言基础【6】】字符串格式化说明

文章目录 零、格式化常用场景一、Go 字符串格式化核心概念二、常用格式化占位符1. 整数类型2. 浮点数类型3. 字符串与布尔类型4. 指针与通用类型 三、宽度与精度控制1. 宽度控制2. 精度控制&#xff08;浮点数/字符串&#xff09; 零、格式化常用场景 数值转字符串&#xff1a…...

基于微信小程序的作业管理系统源码数据库文档

作业管理系统 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和微信小程序来完成对系统的…...

Monorepo架构: 项目管理模式对比与考量

关于 monorepo 相关概念及项目管理模式 在软件开发中&#xff0c;尤其是前端项目&#xff0c;我们会涉及到不同的项目管理模式&#xff0c;这里先介绍几个重要的概念“monorepo”是当前较为热门的一种项目管理方式&#xff0c;虽然很多人可能听说过&#xff0c;但可能在实际项…...

【bat win系统自动运行脚本-双击启动docker及其它】

win系统自动化运行脚本 创建一个 startup.bat右键编辑&#xff0c;输入以下示例 echo off start "" "C:\Program Files\Docker\Docker\Docker Desktop.exe"timeout /t 5docker start your_container_namestart cmd /k "conda activate your_conda_e…...

leetcode238-除自身以外数组的乘积

leetcode 238 思路 可以在不使用除法的情况下&#xff0c;利用前缀积和后缀积来实现解答 前缀积&#xff1a;对每个位置&#xff0c;计算当前数字左侧的所有数字的乘积后缀积&#xff1a;对每个位置&#xff0c;计算当前数字右侧的所有数字的乘积 结合这两种思想&#xff0…...

从零开始学Flink:揭开实时计算的神秘面纱

一、为什么需要Flink&#xff1f; 当你在电商平台秒杀商品时&#xff0c;1毫秒的延迟可能导致交易失败&#xff1b;当自动驾驶汽车遇到障碍物时&#xff0c;10毫秒的计算延迟可能酿成事故。这些场景揭示了一个残酷事实&#xff1a;数据的价值随时间呈指数级衰减。 传统批处理…...

【Mac 从 0 到 1 保姆级配置教程 16】- Docker 快速安装配置、常用命令以及实际项目演示

文章目录 前言1. Docker 是什么&#xff1f;2. 为什么要使用 Docker&#xff1f; 安装 Docker1. 安装 Docker Desktop2. 安装 OrbStack3. Docker Desktop VS OrbStack5. 验证安装 使用 Docker 运行项目1. 克隆项目到本地2. 进入项目目录3. 启动容器: 查看运行效果1. OrbStack 中…...