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

基于Java的设计模式-策略模式

策略模式就是定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

基本概念

策略模式主要是解决多种算法相似的情况下,使用if...else所带来的复杂和难以维护。当存在系统中有多个类,但是区分它们的是只是它们的直接行为,那我们可以把这些封装成一个一个类,然后进行任意替换。

策略模式存在三种角色:

  • Strategy 策略(算法)抽象
  • ConcreteStrategy 各种策略(算法)的具体实现
  • Context 策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。

案例

抽象类

public interface Strategy {public void encrypt();
}

定义算法抽象类,方法为加密。

具体实现类

AES加密

public class AESStrategy implements Strategy{@Overridepublic void encrypt() {System.out.println("执行AES");}}

MD5加密

public class MD5Strategy implements Strategy {@Overridepublic void encrypt() {System.out.println("执行MD5");}
}

继承算法抽象类,具体用AES、MD5方法进行实现。

外部环境封装类

public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy=strategy;}public void encrypt(){this.strategy.encrypt();}
}

测试类

public class MainTest {public static void main(String[] args) {Context context = new Context(new AESStrategy());context.encrypt();}
}

小改一下

上面测试使用的时候,需要自己新建一个实例,阅读性不够好,所以就重新用枚举类修改一下。

算法枚举类

public enum StrategyEnums {MD5("MD5算法"){@Overridepublic Class<?> getStrategyClass() {return MD5Strategy.class;}},AES("AES算法"){@Overridepublic Class<?> getStrategyClass() {return AESStrategy.class;}	};public abstract Class<?> getStrategyClass();private String className;StrategyEnums(){}StrategyEnums(String className){this.className= className;}public String getClassName(){return className;}
}

枚举方法返回算法具体实现类的Class,并加上类的算法描述。

public class Context {private Strategy strategy;public Context(StrategyEnums enums) {try {this.strategy = (Strategy) enums.getStrategyClass().newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}public void encrypt(){this.strategy.encrypt();}
}

包装类的参数改为枚举值,根据枚举值来构建实例。

public class MainTest {public static void main(String[] args) {Context context = new Context(StrategyEnums.AES);context.encrypt();}
}

测试可用,但是这样的话,就是需要同时维护枚举类,新构建一个算法具体类,同时要维护枚举类,不过就是增加了可读性。

总结

使用策略方式可以提供良好的扩展性、避免大量的if...else的条件判断,算法可以自由切换。当遇到多个类似的算法策略,可以考虑策略模式。

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

相关文章:

  • 小程序多种姿势更换文章
  • 读书笔记-《ON JAVA 中文版》-摘要25[第二十二章 枚举]
  • DNDC模型建模方法及应用
  • Kafka为什么是高性能高并发高可用架构
  • QT-day3
  • 开发自测的测试用例设计方法
  • 【AI视野·今日Sound 声学论文速览 第七期】Tue, 19 Sep 2023
  • MySQL 清空表 截断表
  • 2020-2023中国高等级自动驾驶产业发展趋势研究-中国高等级自动驾驶发展近况
  • Spring学习之ImportBeanDefinitionRegistrar接口
  • React 全栈体系(八)
  • 4.开放-封闭原则
  • oracle递归with子句
  • 如何在Proteus进行STM32F103C8T6模拟以及keil5开发
  • C# OpenCvSharp 图片模糊检测(拉普拉斯算子)
  • 志高团队:广阔前景 全新的投资理财体验
  • 基于自编译的onlyoffice镜像,关于修改字体的问题
  • 1.wifi开发,wifi连接初次连接电脑没有识别,搭建环境
  • 【JAVA-Day25】解密进制转换:十进制向R进制和R进制向十进制的过程
  • 牛客网字节面试算法刷题记录
  • QT连接Sqlite
  • ChatGPT AIGC 完成各省份销售动态可视化分析
  • 基于SpringBoot+Vue的餐饮管理系统设计与实现
  • 2023 亲测好用版VScode配置文件
  • jmeter基础压力教程
  • 图片格式大全
  • 5.14.1.2 Get Log Page – Smart Log
  • 【深度学习实验】线性模型(一):使用NumPy实现简单线性模型:搭建、构造损失函数、计算损失值
  • springcloud3 分布式事务-seata的四种模式总结以及异地容灾
  • 【办公类-16-06】20230901大班运动场地分配表-斜线排列、5天循环、不跳节日,手动修改节日”(python 排班表系列)