算法策略的主动选择,拒绝if...else...(策略模式+简单工厂模式)

简介: 算法策略的主动选择,拒绝if...else...(策略模式+简单工厂模式)

算法策略的主动选择,拒绝if...else...(策略模式+简单工厂模式)


本文通过一个切换加解密算法的Demo来学习如何使代码的调用和封装都变的更加简单


1. 抽象策略接口

/**
 * 加密算法接口:封装算法的公共操作加密和解密
 * 
 * @author Spoon
 * @version 1.0.0
 */
public interface SecurityStrategy {
  /**
   * 加密
   */
  public String doEncryption(String key, String plaintext);
  /**
   * 解密
   */
  public String doDeciphering(String key, String ciphertext);
}


2. 策略算法的具体实现

/**
 * AES加密算法具体实现类
 * 
 * @author Spoon
 * @version 1.0.0
 */
public class AesStrategy implements SecurityStrategy{
  @Override
  public String doEncryption(String key, String plaintext) {
    String dec = "";
    try {
      dec = AESUtil.encrypt(plaintext, key, "UTF-8");
    } catch (Exception e) {
      e.printStackTrace();
    }
    return dec;
  }
  @Override
  public String doDeciphering(String key, String ciphertext) {
    String enc = "";
    try {
      enc = AESUtil.decrypt(ciphertext, key);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return enc;
  }
}
/**
 * DES3加密算法具体实现类
 *
 * @author Spoon
 * @version 1.0.0
 */
public class Des3Strategy implements SecurityStrategy{
  @Override
  public String doEncryption(String key, String plaintext) {
    String dec = "";
    try {
      dec = ThreeDES.encode(plaintext, key);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return dec;
  }
  @Override
  public String doDeciphering(String key, String ciphertext) {
    String enc = "";
    try {
      enc = ThreeDES.decode(ciphertext, key);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return enc;
  }
}


3. 加密算法类型枚举

/**
 * 加密算法类型枚举
 * @author Spoon
 * @version 1.0.0
 */
public enum StrategyType {
  AES(1,"AES加密算法"), 
  DES3(2,"DES3加密算法");
  private int index;
  private String desc;
  private StrategyType(int index, String desc){
    this.index = index;
    this.desc = desc;
  }
  public int index() {
    return index;
  }
  public String desc() {
    return desc;
  }
}


4. 使用简单工厂获取具体实现

/**
 * 策略工厂类:将每个实现策略注册到工厂,并根据Type返回指定策略实现 
 * @author Spoon
 * @version 1.0.0
 */
public class StrategyFactory {
  private static Map<Integer, SecurityStrategy> services = new ConcurrentHashMap<Integer, SecurityStrategy>();
  static {
    services.put(StrategyType.AES.index(), new AesStrategy());
    services.put(StrategyType.DES3.index(), new Des3Strategy());
  }
  private StrategyFactory() {
  }
  public static SecurityStrategy getSecurity(Integer type) {
    return services.get(type);
  }
}


5. 策略上下文完成工厂返回实现的具体调用

/**
 * 策略上下文:实际操作对象,接收传入的Type和必要参数,内部调用策略工厂类获取实际实现类进行加解密操作
 * 
 * @author Spoon
 * @version 1.0.0
 */
public class StrategyContext {
  private SecurityStrategy strategy;
  public StrategyContext() {
  }
  public SecurityStrategy getStrategy() {
    return strategy;
  }
  public void setStrategy(SecurityStrategy strategy) {
    this.strategy = strategy;
  }
  public String executeEncryptionStrategy(Integer type, String key, String plaintext) {
    strategy = StrategyFactory.getSecurity(type);
    return strategy.doEncryption(key, plaintext);
  }
  public String executeDecipheringStrategy(Integer type, String key, String ciphertext) {
    strategy = StrategyFactory.getSecurity(type);
    return strategy.doDeciphering(key, ciphertext);
  }
}


6. Test

/**
 *  测试类
 *  String key_aes = "789tenc963qAzWsX";
 *  String key_des3 = "1234567890ASDFGH12345678";
 */
public class Main {
  @SuppressWarnings("resource")
  public static void main(String[] args) {
    String plaintext = "ABCDEFGHIJKLMNOPQRST";
    System.out.println("请选择加密算法(AES:1, DES3:2) :");
    int type = new Scanner(System.in).nextInt();
    System.out.println("请输入加密秘钥 :");
    String key = new Scanner(System.in).nextLine();
    StrategyContext context = new StrategyContext();
    System.out.println(context.executeEncryptionStrategy(type, key, plaintext));
  }
}


通过测试Main方法可以看出,在增加加密算法后对调用方来说只需要关注加密算法的Type值就可以,调用形式也没有发生改变,没有使用条件语句进行判断,减少了调用时出错的风险,对于提供方来说,主要关注点就是策略算法的具体实现,并添加相应的枚举后将实现的策略注册到策略工厂中即可。


Python版本 :

from abc import ABCMeta,abstractmethod
class SecurityStrategy:
    __metaclass__ = ABCMeta  # 指定这是一个抽象类
    @abstractmethod  # 抽象方法
    def doEncryption(self, key, plaintext):
        pass
    @abstractmethod  # 抽象方法
    def doDeciphering(self, key, ciphertext):
        pass
from SecurityStrategy import SecurityStrategy
class AesStrategy(SecurityStrategy):
    def doEncryption(self, key, plaintext):
        print('AES === > ', 'key : ', key, 'plaintext : ', plaintext)
    def doDeciphering(self, key, ciphertext):
        print('AES === > ', 'key : ', key, 'ciphertext : ', ciphertext)
from SecurityStrategy import SecurityStrategy
class Des3Strategy(SecurityStrategy):
    def doEncryption(self, key, plaintext):
        print('Des3 === > ', 'key : ', key, 'plaintext : ', plaintext)
    def doDeciphering(self, key, ciphertext):
        print('Des3 === > ', 'key : ', key, 'ciphertext : ', ciphertext)
from enum import Enum
class StrategyType(Enum):
    AES = 1
    DES3 = 2
from StrategyType import StrategyType
from impl.AesStrategy import AesStrategy
from impl.Des3Strategy import Des3Strategy
class StrategyFactory:
    services = {
        StrategyType.AES.value: AesStrategy(),
        StrategyType.DES3.value: Des3Strategy()
    }
    @staticmethod
    def getSecurity(type):
        return StrategyFactory.services[type]
from StrategyFactory import StrategyFactory
class StrategyContext:
    @staticmethod
    def executeEncryptionStrategy(type, key, plaintext):
        return StrategyFactory.getSecurity(type).doEncryption(key, plaintext)
    @staticmethod
    def executeDecipheringStrategy(type, key, ciphertext):
        return StrategyFactory.getSecurity(type).doDeciphering(key, ciphertext)
from StrategyContext import StrategyContext
if __name__ == '__main__':
    print("---------------开始测试-------------------")
    StrategyContext.executeEncryptionStrategy(1, '1234567890ASDFGH12345678', 'ABCDEFGHIJKLMNOPQRST')
    StrategyContext.executeDecipheringStrategy(1, '1234567890ASDFGH12345678', 'ABCDEFGHIJKLMNOPQRST')
    StrategyContext.executeEncryptionStrategy(2, '1234567890ASDFGH12345678', 'ABCDEFGHIJKLMNOPQRST')
    StrategyContext.executeDecipheringStrategy(2, '1234567890ASDFGH12345678', 'ABCDEFGHIJKLMNOPQRST')
    print("---------------结束测试-------------------")


相关文章
|
2月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
166 26
|
6月前
|
存储 监控 算法
解析公司屏幕监控软件中 C# 字典算法的数据管理效能与优化策略
数字化办公的时代背景下,企业为维护信息安全并提升管理效能,公司屏幕监控软件的应用日益普及。此软件犹如企业网络的 “数字卫士”,持续记录员工电脑屏幕的操作动态。然而,伴随数据量的持续增长,如何高效管理这些监控数据成为关键议题。C# 中的字典(Dictionary)数据结构,以其独特的键值对存储模式和高效的操作性能,为公司屏幕监控软件的数据管理提供了有力支持。下文将深入探究其原理与应用。
143 4
|
2月前
|
存储 并行计算 算法
【动态多目标优化算法】基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2023研究(Matlab代码实现)
【动态多目标优化算法】基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2023研究(Matlab代码实现)
139 4
|
3月前
|
机器学习/深度学习 算法 数据可视化
近端策略优化算法PPO的核心概念和PyTorch实现详解
本文深入解析了近端策略优化(PPO)算法的核心原理,并基于PyTorch框架实现了完整的强化学习训练流程。通过Lunar Lander环境展示了算法的全过程,涵盖环境交互、优势函数计算、策略更新等关键模块。内容理论与实践结合,适合希望掌握PPO算法及其实现的读者。
543 2
近端策略优化算法PPO的核心概念和PyTorch实现详解
|
2月前
|
运维 算法 安全
基于变异粒子群算法的主动配电网故障恢复策略(Matlab代码实现)
基于变异粒子群算法的主动配电网故障恢复策略(Matlab代码实现)
|
4月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
120 4
|
6月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
167 3
|
5月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
157 0
|
8月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
174 8
|
9月前
|
机器学习/深度学习 存储 算法
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
近端策略优化(PPO)是深度强化学习中高效的策略优化方法,广泛应用于大语言模型的RLHF训练。PPO通过引入策略更新约束机制,平衡了更新幅度,提升了训练稳定性。其核心思想是在优势演员-评论家方法的基础上,采用裁剪和非裁剪项组成的替代目标函数,限制策略比率在[1-ϵ, 1+ϵ]区间内,防止过大的策略更新。本文详细探讨了PPO的基本原理、损失函数设计及PyTorch实现流程,提供了完整的代码示例。
3821 10
近端策略优化(PPO)算法的理论基础与PyTorch代码详解

热门文章

最新文章