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

2023-09-15 09:33:50

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

基本概念

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

策略模式存在三种角色:

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

案例

抽象类
public interface Strategy {
	public void encrypt();
}

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

具体实现类

AES加密

public class AESStrategy implements Strategy{

	@Override
	public void encrypt() {
		System.out.println("执行AES");
	}

}

MD5加密

public class MD5Strategy implements Strategy {
	@Override
	public 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算法"){
		@Override
		public Class<?> getStrategyClass() {
			return MD5Strategy.class;
		}
	},AES("AES算法"){
		@Override
		public 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的条件判断,算法可以自由切换。当遇到多个类似的算法策略,可以考虑策略模式。

更多推荐

安卓系列机型 框架LSP 安装步骤 支持多机型 LSP框架通用安装步骤【二】

​​​​​​安卓玩机教程---全机型安卓4----安卓12框架xpedxlsp安装方法【一】低版本可以参考上个博文了解相关安装方法。LSP框架优点简单来说装lsp框架的优点在于可以安装各种模块。包括但不限于系统优化加速游戏开挂等等的模块。大致相当于电脑的扩展油猴Lsposed框架是在Edposed框架的基础上进行改良的

【云原生 | 57】Docker三剑客之Docker Swarm֯使用其他服务发现后端

🍁博主简介:🏅云计算领域优质创作者🏅2022年CSDN新星计划python赛道第一名🏅2022年CSDN原力计划优质作者🏅阿里云ACE认证高级工程师🏅阿里云开发者社区专家博主💊交流社区:CSDN云计算交流社区欢迎您的加入!目录1.使用文件2.其他发现服务后端3.地址和端口的范围匹配👑👑👑结束语👑�

云原生之使用Docker部署SSCMS内容管理系统

云原生之使用Docker部署SSCMS内容管理系统一、SSCMS介绍二、本地环境介绍2.1本地环境规划2.2本次实践介绍三、本地环境检查3.1检查Docker服务状态3.2检查Docker版本3.3检查dockercompose版本四、下载SSCMS镜像五、部署SSCMS内容管理系统5.1创建SSCMS容器5.2检查S

制作学生查询小程序

学生个人成绩查询小程序,一款助力教师实时了解学生学习情况的便捷工具。本文将为您揭秘它的制作过程,并提供实用的建议。然而,简便易用的方法莫过于选择现有的工具。许多教师都偏爱使用易查分来快速创建查分网站。与传统的独立开发方式不同,易查分免去了高昂的定制费用和计算机技术要求。只需简单操作电脑,教师们就能通过上传成绩表格轻松制

家政服务小程序上门服务小程序预约上门服务维修保洁上门服务在线派单技师入口

套餐一:源码=1500元套餐二:全包服务包服务器+域名+认证小程序+搭建+售后=2000元主要功能:1、服务商入驻支持个人或企业入驻成为平台服务商;2、发布商品入驻服务商后,可以发布服务商品,用户可以在线下单,预约服务;3、发布需求用户可以发布一口价或竞价需求,服务商抢-单,用户可以选择服务商下单服务;4、服务商等级支

家族小程序:连接亲情的技术纽带

家族小程序是一种基于互联网技术的应用程序,旨在为家族成员提供便捷的沟通与分享平台。它通过集成了多种功能模块,如家族动态、相册分享、日程安排等,实现了家庭成员之间的实时互动和信息共享。本文将深入探讨家族小程序的原理和功能,分析其对家庭关系的影响,并就其发展趋势进行思考,旨在为读者提供专业且有深度的见解,进一步了解家族小程

Android 修复在 Settings 首页,按键盘方向键逐个单选

Android修复在Settings首页,按键盘方向键逐个单选问题现象问题分析解决办法问题现象在Settings主界面,按键盘方向键上下会直接整个选中,无法单条选中变色,而在二级页面中按方向键上下是正常的。没有遥控器可以通过adb指令模拟下键adbshellinputkeyevent20问题分析Settings中都是用

win部署CRM

win部署crm)1.phpstudy2.composer3.代码4.其他配置周末锴哥让我帮他部署了一个CRM,写个教程,方便之后他用。锴哥用的是NxCrm,先把代码下下来。1.phpstudy1.首先是下载小皮面板,配置php的环境。这里面下载了php8.2.9nts版本的,然后把原来的7版本的就删掉了。2.将代码解

MyBatis字段名和属性名不一样的解决方案

一、给字段起别名,保持和属性名一样<!--List<Emp>getAllEmp();--><selectid="getAllEmp"resultType="Emp">selecteid,emp_nameempName,age,sex,emailfromt_emp</select>如上面的SQL语句将emp_name取别

HarmonyOS之 应用程序页面UIAbility

一UIAbility介绍:1.1UIAbility是一种包含用户界面的应用组件,用于和用户进行交互UIAbility是系统调度的单元、提1.2供窗口用于界面绘制2.UIAbility的创建和对应页面的创建1.3UIAbility内页面间的跳转1.4UIAbility的创建、前后台切换、销毁的生命周期状态二UIAbili

Vue模板语法(下)

目录一、事件处理器1.1定义1.2类型1.3阻止单击事件冒泡1.4事件只能单击一次二、表单的综合案例2.1定义2.2常用功能3.3代码演示与讲解三、组件通信3.1定义3.2实现方式3.3自定义组件3.3.1定义3.3.2自定义组件代码演示3.4组件通信父传子3.4.1定义3.4.2传递过程3.4.3代码演示3.5组件通

热文推荐