当前位置: 首页 > 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父类、分别封装起来=子类、让它们之间可以相互替换,算法的变化=多态、不会影响到使用算法的客户端=客户端满足开闭原则但是不太彻底

五、升华

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

http://www.lryc.cn/news/122168.html

相关文章:

  • 基于Googlenet深度学习网络的人员行为动作识别matlab仿真
  • 存储过程的学习
  • zookeeperAPI操作与写数据原理
  • 防火墙对双通道协议的处理
  • vscode搭建c语言环境问题
  • 全网最全的接口自动化测试教程
  • 数据结构----结构--线性结构--链式存储--链表
  • 【5G 核心网】5G 多PDU会话锚点技术介绍
  • K8s环境下监控告警平台搭建及配置
  • 微信小程序在使用vant组件库时构建npm报错
  • Django实现音乐网站 ⑽
  • SpringMVC的架构有什么优势?——异常处理与文件上传(五)
  • 【java面向对象中static关键字】
  • 系统学习Linux-Redis集群
  • 【每日随笔】帝王心术 ② ( 如何培养下一代 | 重点培养孩子某一项特长 | 价值观培养 | 独立思考 | 人性和谋略教育 | 资源传承 | 人生指引 )
  • Git简介
  • STM32入门学习之定时器输入捕获
  • 贪心算法:基础入门篇
  • 【Windows10下启动RocketMQ报错:找不到或无法加载主类 Files\Java\jdk1.8.0_301\lib\dt.jar】解决方法
  • 深入篇【Linux】学习必备:进程理解(从底层探究进程概念/进程创建/进程状态/进程优先级)
  • Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?
  • 基于Java+SpringBoot+Vue的网吧管理系统设计与实现(源码+LW+部署文档等)
  • redis设置database 不生效剖析
  • 汽车及汽车零部件行业云MES解决方案
  • 算法工程师-机器学习面试题总结(4)
  • Linux学习之awk函数
  • Redis的数据结构到底是一种什么样的结构?
  • eclipse 导入项目js报错问题
  • 《HeadFirst设计模式(第二版)》第七章代码——外观模式
  • 前端杂项-个人总结八股文的背诵方案