Java设计模式——策略模式——方法多样 调度灵活

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 本文目录1. 何为策略2. 举个栗子2.1 抽象策略2.2 具体策略2.3 调用环境2.4 调用示例2.5 借助枚举与工厂模式规范调用

1. 何为策略

策略,英文strategy,音标[ˈstrætədʒi],来来来,此处read after me大声读三遍,什么重音、清辅音、浊辅音我都玩的有模有样,十分优秀吭。


策略就是方法,办法,方针,计谋差不多的意思,策略模式就如把三十六计汇聚成一本书,一块研究管理,不然的话如此多的策略,打起仗来临时抱佛脚也不知道该去哪里抱啊。


所以策略模式就是把策略归置好,并且通过一个集中的环境去读取后使用。例如三十六计,就是把三十六中计谋集中归置到书本(集中的环境)中,代后人调阅,也不用管后人到底是古代人,还是现代人,还是中国人,还是外国人,就是这么牛X吭。


2. 举个栗子

光说不练是假把式,手中必须有栗子才是真本事,此处我们举个现实的编程实例。


比如现在我们有很多种数字加密算法,我们应该把这些不同的算法(策略)封装起来,后续不管是网页调用也好,是APP调用也好都可以直接拿过来使用。所以此处就是一个比较标准的策略模式使用场景。


2.1 抽象策略

首先分析下我们的策略是什么样的策略,实际上就是对数字加密,因此封装一个接口IEncryptStrategy,注意这个命令中I表示这是一个接口,Encrypt表示加密,Strategy表示策略,综合起来讲,这是一个加密策略的接口。代码如下:


package org.demo.strategy;

/**

* @theme 加密策略接口

* @author maoge

* @date 2019-12-10

*/

public interface IEncryptStrategy {

/**

 * 对一个数字进行加密

 */

public double encrypt(double input);

}



2.2 具体策略

抽象策略是为了定义一个标准,只有符合标准的才能纳入该类策略,比如此处必须是能对数字加密的策略才行,此处我们实现两个牛X的加密算法,稳!


package org.demo.strategy;


/**

* @theme 加法加密策略

* @author maoge

* @date 2019-12-10

*/

public class AddEncryptStrategy implements IEncryptStrategy {

/**

 * 将原来的值先+1,再加3,再+2,如此复杂的加密算法,一般人想不到哈

 */

@Override

public double encrypt(double input) {

 return input + 1 + 3 + 2;

}

}


package org.demo.strategy;


/**

* @theme 乘法加密策略

* @author maoge

* @date 2019-12-10

*/

public class MultiplyEncryptStrategy implements IEncryptStrategy {

/**

 * 乘法加密——为高端加密算法代言

 */

@Override

public double encrypt(double input) {

 return input * 10;

}

}


2.3 调用环境

策略有了之后,最好放在一个统一的管理环境中,便于灵活调度。就好比要查询计谋可去看《三十六计》书,要调用加密算法就使用加密算法上下文环境。


package org.demo.strategy;


/**

* @theme 加密算法上下文环境

* @author maoge

* @date 2019-12-10

*/

public class EncryptContext {

/**

 * 可保存任意策略

 */

private IEncryptStrategy strategy;


public EncryptContext(IEncryptStrategy strategy) {

 this.strategy = strategy;

}


/**

 * 调用保存的策略

 */

public double encrypt(double input) {

 return strategy.encrypt(input);

}

}


2.4 调用示例

package org.demo.strategy;

/**

* 常规调用实例

*/

public class NormalUseStrategy {

public static void main(String[] args) {

 EncryptContext context = new EncryptContext(new AddEncryptStrategy());

 System.out.println("加法策略:" + context.encrypt(1));

 context = new EncryptContext(new MultiplyEncryptStrategy());

 System.out.println("乘法策略:" + context.encrypt(1));

}

}


2.5 借助枚举与工厂模式规范调用

上面的调用示例对策略生成的管理太随意了,我们可以借助枚举和工厂模式来规范之,代码如下:


加密方法枚举:


package org.demo.strategy;

public enum EncryptStrategyEnum {

ADD, MULTIPLY;

}


工厂模式的环境类:


package org.demo.strategy;


/**

* @theme 加密算法上下文环境

* @author maoge

* @date 2019-12-10

*/

public class EncryptContext {

/**

 * 可保存任意策略

 */

private IEncryptStrategy strategy;


/**

 * 根据枚举生成策略

 */

public EncryptContext(EncryptStrategyEnum encryptStrategyEnum) {

 if (encryptStrategyEnum == EncryptStrategyEnum.ADD) {

  strategy = new AddEncryptStrategy();

 } else {

  strategy = new MultiplyEncryptStrategy();

 }

}


/**

 * 调用保存的策略

 */

public double encrypt(double input) {

 return strategy.encrypt(input);

}

}


调用示例:


package org.demo.strategy;


/**

* 调用实例

*/

public class Demo {

public static void main(String[] args) {

 EncryptContext context = new EncryptContext(EncryptStrategyEnum.ADD);

 System.out.println("加法策略:" + context.encrypt(1));

 context = new EncryptContext(EncryptStrategyEnum.MULTIPLY);

 System.out.println("乘法策略:" + context.encrypt(1));

}

}

相关文章
|
1月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
74 9
|
1月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
48 4
|
25天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
29天前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
41 4
|
29天前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
29 4
|
27天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
26 1
|
27天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
43 1
|
1月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
29 2
|
1月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
38 4