• 软件设计模式白话文系列(十四)策略模式


    1、模式描述

    定义一个算法的系列,将其各个分装,并且使他们有交互性。策略模式使得算法在用户使用的时候能独立的改变。

    在 Java 中,从 JDK1.8 开始支持函数式编程,就是策略模式的一种体现,且无需借助额外的类和接口,代码更加简洁。

    2、模式结构

    • 抽象策略类:定义策略算法的规范。
    • 具体策略类:实现抽象策略类,提供具体的算法实现或行为。
    • 环境类:持有抽象策略类的引用,由客户端构造时,客户制定具体使用策略类。

    3、实现逻辑

    定义一个抽象类或接口(抽象策略类),定义出算法或行为规范;再实现多个具体策略类;定义环境类持有抽象引用;在客户端调用动态选择策略。

    4、实战代码

    模拟创建证书时使用不同算法创建密钥。

    /**
     * 抽象策略类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 18:11:19
     */
    public interface KeyAlgorithm {
        void getAlgorithm();
    }
    
    /**
     * 具体策略类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 18:13:26
     */
    public class RsaAlgorithm implements KeyAlgorithm {
    
        @Override
        public void getAlgorithm() {
            System.out.print("使用 RSA 算法");
        }
    }
    
    /**
     * 具体策略类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 18:13:26
     */
    public class Sm2Algorithm implements KeyAlgorithm {
        @Override
        public void getAlgorithm() {
            System.out.print("使用 SM2 算法");
        }
    }
    
    /**
     * 具体策略类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 18:13:26
     */
    public class EcdsaAlgorithm implements KeyAlgorithm {
        @Override
        public void getAlgorithm() {
            System.out.print("使用 ECDSA 算法");
        }
    }
    
    /**
     * 环境类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 18:16:42
     */
    public class Certificate {
        private KeyAlgorithm keyAlgorithm;
    
        public Certificate(KeyAlgorithm keyAlgorithm) {
            this.keyAlgorithm = keyAlgorithm;
        }
    
        public void creatCertificate() {
            keyAlgorithm.getAlgorithm();
            System.out.println("创建证书");
        }
    }
    
    /**
     * 测试类
     *
     * @author Eajur.Wen
     * @version 1.0
     * @date 2022-11-16 18:22:13
     */
    public class Client {
        public static void main(String[] args) {
            new Certificate(new Sm2Algorithm()).creatCertificate();
            new Certificate(new RsaAlgorithm()).creatCertificate();
            new Certificate(new EcdsaAlgorithm()).creatCertificate();
        }
    }
    

    将创建证书时生成密钥使用的算法控制权交与客户端。

    5、适用场景

    • 需要在运行时,动态选择对象内算法。
    • 需要客户端调用时自主选择算法。

    6、策略模式和桥接模式区别

    策略模式属于对象行为型模式,而桥接模式属于结构型模式。

    两种模式都存在一个对象使用聚合的方式引用另一个对象的抽象接口的情况,而且接口的实现可以有多种提供给客户端选择。但相对于策略模式,桥接模式表示的内容更多,结构更复杂,主要目的实现接口隔离原则,即把本质上并不内聚的两种体系区分开来,而策略模式只是算法的层次,没有达到体系层次。从结构上看,桥接模式是包括策略模式,可以看成策略模式的 Plus 版。

    6、策略模式和模版模式区别

    策略模式属于对象行为模式,基于组合机制,在对象层次运作,允许在运行时切换行为。

    模版方法模式属于类行为模式,基于继承机制,允许通过扩展子类的部分内容来改变部分算法。

    模版方法是调整流程中部分算法或流程的处理,策略模式前调完全替换整个算法。

  • 相关阅读:
    搭建MyCat2一主一从的MySQL读写分离
    基于PyTorch搭建你的生成对抗性网络
    移远EC600U-CN开发板 11.22
    Android Studio Dolphin Patch 1 简介及下载地址
    Docker 修改镜像的Digests值
    OpenCV:实现图像的负片
    C语言自定义类型一网打尽(结构体、位段/位域、枚举、联合体)
    2022年6月PMP考试,大家觉得考的怎么样?我3A通过了
    Grafana系列-Loki-基于日志实现告警
    递归是会更秀strtok
  • 原文地址:https://www.cnblogs.com/eajur/p/16917864.html