设计模式再探——策略模式
目录
- 一、背景介绍
- 二、思路&方案
- 三、过程
- 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.策略模式的例子改造(配置文件反射) 四、总结五、升华 一、背景介绍 最近在做产品的过程中,对于主题讨论回复内容,按照追评次数排…...

基于Googlenet深度学习网络的人员行为动作识别matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1. 原理 1.1 深度学习与卷积神经网络(CNN) 1.2 GoogLeNet 2. 实现过程 2.1 数据预处理 2.2 构建网络模型 2.3 数据输入与训练 2.4 模型评估与调优 3. 应用领域…...

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

zookeeperAPI操作与写数据原理
要执行API操作需要在idea中创建maven项目 (改成自己的阿里仓库)导入特定依赖 添加日志文件 上边操作做成后就可以进行一些API的实现了 目录 导入maven依赖: 创建日志文件: 创建API客户端: (1)…...
防火墙对双通道协议的处理
防火墙是一种网络安全设备或软件,用于控制网络流量并保护计算机网络免受未经授权的访问、恶意攻击和网络威胁。它作为网络的第一道防线,用于监视、过滤和管理进出网络的数据包。 防火墙可以基于预设的安全策略对网络流量进行评估和筛选。它通过比较数据…...

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

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

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

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

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

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

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

SpringMVC的架构有什么优势?——异常处理与文件上传(五)
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...

【java面向对象中static关键字】
提纲 static修饰成员变量static修饰成员变量的应用场景static修饰成员方法static修饰成员方法的应用场景static的注意事项static的应用知识:代码块static的应用知识:单例设计模式 static静态的意思,可以修饰成员变量,成员方法&a…...

系统学习Linux-Redis集群
目录 一、Redis主从复制 概念 作用 缺点 流程 二、Reids哨兵模式(sentinel) 概念 作用 缺点 结构 搭建 三、redis集群 概述 原理 架构细节 选举过程 实验环境模拟 一、Redis主从复制 概念 是指将一台Redis服务器的数据,复制…...
【每日随笔】帝王心术 ② ( 如何培养下一代 | 重点培养孩子某一项特长 | 价值观培养 | 独立思考 | 人性和谋略教育 | 资源传承 | 人生指引 )
文章目录 一、重点培养孩子某一项特长二、价值观培养三、独立思考四、人性和谋略教育五、资源传承六、人生指引 一、重点培养孩子某一项特长 很多人 作为 父母 , 教育孩子 , 没有出息的占大多数 ; 父母 教育 孩子 , 给孩子培训 , 一般都给报个兴趣班 , 如果兴趣班的种类超过两…...

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

STM32入门学习之定时器输入捕获
1.定时器的输入捕获可以用来测量脉冲宽度或者测量频率。输入捕获的原理图如下: 假设定时器是向上计数。在图中,t1~t2之间的便是我们要测量的高电平的时间(脉冲宽度)。首先,设置定时器为上升沿捕获,如此一来,在t1时刻可…...
贪心算法:基础入门篇
贪心算法:基础入门篇 文章目录: 贪心算法:基础入门篇一、认识贪心算法二、常见贪心问题2.1 纸牌问题2.2 背包问题(基础版)2.3 简单数学证明问题 三、总结 一、认识贪心算法 在求最优解的问题中,以某种贪心…...

【Windows10下启动RocketMQ报错:找不到或无法加载主类 Files\Java\jdk1.8.0_301\lib\dt.jar】解决方法
Windows10下启动RocketMQ报错:找不到或无法加载主类 一、问题产生二、产生原因三、解决办法 一、问题产生 参考RocketMQ Github官网上的说明,下载rocketmq-all-5.1.3-bin-release.zip,解压配置环境变量后,执行如下命令:…...

篇章一 论坛系统——前置知识
目录 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推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域,电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式,存在单点位单独头溯源、网关布线…...

Xcode 16.2 版本 pod init 报错
Xcode 版本升级到 16.2 后,项目执行 pod init 报错; ### 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. 精度控制(浮点数/字符串) 零、格式化常用场景 数值转字符串:…...

基于微信小程序的作业管理系统源码数据库文档
作业管理系统 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和微信小程序来完成对系统的…...
Monorepo架构: 项目管理模式对比与考量
关于 monorepo 相关概念及项目管理模式 在软件开发中,尤其是前端项目,我们会涉及到不同的项目管理模式,这里先介绍几个重要的概念“monorepo”是当前较为热门的一种项目管理方式,虽然很多人可能听说过,但可能在实际项…...
【bat win系统自动运行脚本-双击启动docker及其它】
win系统自动化运行脚本 创建一个 startup.bat右键编辑,输入以下示例 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 思路 可以在不使用除法的情况下,利用前缀积和后缀积来实现解答 前缀积:对每个位置,计算当前数字左侧的所有数字的乘积后缀积:对每个位置,计算当前数字右侧的所有数字的乘积 结合这两种思想࿰…...

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

【Mac 从 0 到 1 保姆级配置教程 16】- Docker 快速安装配置、常用命令以及实际项目演示
文章目录 前言1. Docker 是什么?2. 为什么要使用 Docker? 安装 Docker1. 安装 Docker Desktop2. 安装 OrbStack3. Docker Desktop VS OrbStack5. 验证安装 使用 Docker 运行项目1. 克隆项目到本地2. 进入项目目录3. 启动容器: 查看运行效果1. OrbStack 中…...