首页 > 其他分享 >软件设计模式白话文系列(十四)策略模式

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

时间:2022-11-23 12:22:27浏览次数:53  
标签:11 策略 16 软件设计 模式 算法 白话文 public

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、策略模式和模版模式区别

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

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

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

标签:11,策略,16,软件设计,模式,算法,白话文,public
From: https://www.cnblogs.com/eajur/p/16917864.html

相关文章

  • 数字展馆虚拟迎宾讲解员,开启展馆全新讲解模式!
    “虚拟迎宾讲解员”是一种利用数字技术与定制内容相结合的互动系统,是当下数字互动展厅中不可少的多媒体展项,它通过多媒体技术、虚拟成像等技术再现物体的真实三维图像,将解说......
  • 【数据库系统原理与设计】(五)关系数据理论与模式求精
    五. 关系数据理论与模式求精5.1问题提出 1. 数据冗余导致的问题: 冗余存储:信息被重复存储,导致浪费大量存储空间更新异常:当重复信息的一个副本被修改,所有副本都必......
  • CPP2nd CRTP Facade 模式
    书中源码不全,看看我这个?#include<iostream>#include<type_traits>#include<vector>#include<iterator>template<typenameDerived,typenameValue,typenameCa......
  • JAVA---单例模式
    单例模式单例的目的是保证某个类仅有一个实例。当有某些类创建对象内存开销较大时可以考虑使用该模式。单例模式又分为饿汉式和懒汉式。1.饿汉式饿汉式。顾名思义,该......
  • c语言的钩子与C++的策略模式
    1.c语言钩子:特性模块:功能函数,调用注册函数主线模块:注册函数,定义钩子(通常是全局变量),调用钩子 2.c++策略模式:特性模块:从策略基类派生一个新特性类,实例化对象并调用se......
  • vue-router的两种模式实现原理
    1.hash模式的简单实现2.history模式的简单实现......
  • 单例模式
    单例模式指的是:此类在任何时候都只存在一个对象:实现步骤:1、构造器私有化。2、提供获取对象的方法getInstance()。分类:饿汉式:在加载类的时候就创建对象。......
  • webpack - 开发模式
    1.设置webpack为开发模式设置模式(mode:development/production)设置sourcemaps(devtool:'inline-source-map')constpath=require('path');constHtmlWebpa......
  • 推特群控营销:自动发帖模式
    说到群控,大家一点也不陌生,今天推特群推王给大家介绍一下twitter群控,现在很多企业都在通过推特做推广,简单来说,Twitter群控营销就是借助第三方群控软件控制多个账号,同时大批量......
  • 设计模式 - (抽象)工厂模式
    本文以故事方式介绍工厂模式以及抽象工厂模式的一些知识,本文出现的人名为化名周末闲来无事,小可爱给大漂亮说想吃烤红薯,让大漂亮做给小可爱吃,大漂亮有点为难了,一个堂堂七尺......