《设计模式》之策略模式

策略模式定义

比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现种策略,在不同场景使用不同的实现,并且可以自由切换策略。

策略模式结构

策略模式需要一个策略接口,不同的策略实现不同的实现类,在具体业务环境中仅持有该策略接口,根据不同的场景使用不同的实现类即可。
在这里插入图片描述

面向接口编程,而不是面向实现。

优点

1、干掉繁琐的 if、switch 判断逻辑;

2、代码优雅、可复用、可读性好;

3、符合开闭原则(对修改关闭, 对扩展开放),扩展性好、便于维护;

缺点

1、策略如果很多的话,会造成策略类膨胀;

2、使用者必须清楚所有的策略类及其用途;

策略模式代码示例

  • 基础登录接口
//基础登录接口
public interface BaseLoginService {
    void login(BaseLoginContext context);
}
  • 策略上下文实现
@Data
public class BaseLoginContext {
    private String userName;

    private String password;

    private BaseLoginService baseLoginService;

    public BaseLoginContext(String userName, String password, BaseLoginService baseLoginService) {
        this.userName = userName;
        this.password = password;
        this.baseLoginService = baseLoginService;
    }

    public void login(){
        baseLoginService.login(this);
    }
}
  • 定义具体的策略实现类
  1. 实现类1
public class SimpleLoginServiceImpl implements BaseLoginService {
    @Override
    public void login(BaseLoginContext context) {
        System.out.println("简单登录,当前登录的人:" + context.getUserName() + ",密码:" + context.getPassword());
    }
}
  1. 实现类2
public class HardLoginServiceImpl implements BaseLoginService {
    @Override
    public void login(BaseLoginContext context) {
        System.out.println("复杂登录,当前登录的人:" + context.getUserName() + ",密码:" + context.getPassword());
    }
}
  • 调用
public static void main(String[] args) {
        BaseLoginService simple = new SimpleLoginServiceImpl();
        BaseLoginContext simpleContext = new BaseLoginContext("simple","simple",simple);
        simpleContext.login();

        BaseLoginService hard = new HardLoginServiceImpl();
        BaseLoginContext hardContext = new BaseLoginContext("hard","hard",hard);
        hardContext.login();
    }
  • 结果
    在这里插入图片描述

扩展策略

方式1

在策略的算法实现上添加自己需要的数据的方式

public class CommonLoginServiceImpl implements BaseLoginService {

    private String userId;

    public CommonLoginServiceImpl(String userId) {
        this.userId = userId;
    }

    public String getUserId() {
        return userId;
    }

    @Override
    public void login(BaseLoginContext context) {
        System.out.println("复杂登录,当前登录的人:" + context.getUserName() + ",账号:" + getUserId() + ",密码:" + context.getPassword());
    }
}
  • 调用
public static void main(String[] args) {
        BaseLoginService simple = new SimpleLoginServiceImpl();
        BaseLoginContext simpleContext = new BaseLoginContext("simple","simple",simple);
        simpleContext.login();

        BaseLoginService hard = new HardLoginServiceImpl();
        BaseLoginContext hardContext = new BaseLoginContext("hard","hard",hard);
        hardContext.login();

        BaseLoginService common = new CommonLoginServiceImpl("001");
        BaseLoginContext commonContext = new BaseLoginContext("common","common",common);
        commonContext.login();
    }
  • 结果
    在这里插入图片描述

方式2

扩展上下文的方式

public class NewLoginContext extends BaseLoginContext{
    private String userId;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public NewLoginContext(String userName, String password, String userId, BaseLoginService baseLoginService) {
        super(userName, password, baseLoginService);
        this.userId = userId;
    }
}
  • 实现类
public class CommonLoginServiceImpl implements BaseLoginService {

    private String userId;

    public CommonLoginServiceImpl(String userId) {
        this.userId = userId;
    }

    public String getUserId() {
        return userId;
    }

    @Override
    public void login(BaseLoginContext context) {
        NewLoginContext newLoginContext = (NewLoginContext)context;
//        System.out.println("common1登录,当前登录的人:" + context.getUserName() + ",账号:" + getUserId() + ",密码:" + context.getPassword());
        System.out.println("common2登录,当前登录的人:" + context.getUserName() + ",账号:" + newLoginContext.getUserId() + ",密码:" + context.getPassword());
    }
}
  • 调用
public static void main(String[] args) {
        BaseLoginService simple = new SimpleLoginServiceImpl();
        BaseLoginContext simpleContext = new BaseLoginContext("simple","simple",simple);
        simpleContext.login();

        BaseLoginService hard = new HardLoginServiceImpl();
        BaseLoginContext hardContext = new BaseLoginContext("hard","hard",hard);
        hardContext.login();

//        BaseLoginService common1 = new CommonLoginServiceImpl("001");
//        BaseLoginContext commonContext1 = new BaseLoginContext("common","common",common1);
//        commonContext1.login();

        BaseLoginService common2 = new CommonLoginServiceImpl("001");
        NewLoginContext commonContext2 = new NewLoginContext("common","common","002",common2);
        commonContext2.login();
    }
  • 结果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/291184.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用二维码看视频?视频做成二维码的快捷教程

现在将视频存入二维码中之后,让其他人通过扫码的方式来看视频是一种很流行的方式,那么视频是怎么制作成二维码的呢?对于想要学习制作视频二维码的小伙伴,可以学习一下本篇文章带来的制作方法,通过二维码视频生成器就可…

量子计算突破5G通信MIMO优化!真机测试完整报告公开!

​摘要:在无线通信领域,大规模多输入多输出 (MIMO)是一项革命性技术,也是5G系统的关键技术之一,它主要利用基站上的大量天线来提高无线通信系统的覆盖范围和容量。通过波束赋形,大规模MIMO可以同时提供多种…

工业物联网中的网络建设是如何实现的?——青创智通工业物联网

在工业物联网的应用中,如何进行网络建设,对于青创智通工业物联网来说,车间内所有装备均可通过与OPC UA网关连接实现数据采集,OPC UA网关实现Modbus协议、DLT645协议、BACnet协议、CJ188协议、三菱协议、西门子协议、Mbus协议。 通…

大数据开发与低代码:加速数据处理与解决方案开发

随着数据量的爆炸式增长,大数据开发变得愈发重要。然而,传统的大数据开发方法往往需要复杂的编码和开发过程,消耗时间和资源。而低代码开发平台的出现为大数据开发带来了全新的解决方案。本文将介绍大数据开发和低代码的概念,并探…

零售EDI:Metro EDI项目案例

麦德龙Metro 总部位于杜塞尔多夫,在全球范围内经营批发和零售业务。在2018/2019 财年,麦德龙Metro 的全球销售额约为 270 亿欧元。从2016年开始,麦德龙Metro就开始对其当时约230家门店和20,000多家分销合作伙伴进行数字化整合,借助…

UseContentHash选项能否在打包AssetBundle时计算可靠的Hash

1)UseContentHash选项能否在打包AssetBundle时计算可靠的Hash 2)如何清理Native Reserved部分的内存 3)Addressables资源完整性校验 4)通过Image.color和CanvasRenderer.SetColor修改UI组件颜色的区别 这是第368篇UWA技术知识分享…

kubernetes(K8s)的使用和常用命令

K8S kubernetes,由于k和s之间有8个字符,所以简称k8s,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2015年7月发布第一个正式版本,它的本质…

密码学:一文看懂Base64算法

文章目录 前言什么是Base64?Base64算法的由来Base64算法的定义Base64算法与加密算法的关系实现原理非ASCII码字符编码传递模型应用场景电子邮件传输网络数据传输密钥存储数字证书 参考 前言 Base64常常在我们开发中出现,我们可能只知道它是一串乱码&…

60m长H型钢在线测长与切割是如何做到的?

H型钢是断面形状类似于大写拉丁字母H的一种经济断面型材,又叫万能钢梁、宽缘(边)工字钢或平行翼缘工字钢。应用范围广,各种民用和工业建筑结构,各种大跨度的工业厂房和现代化高层建筑,大型桥梁等均可看到H型钢的身影。 它应用所在…

opencv入门到精通——Canny边缘检测

目录 理论 OpenCV中的Canny Edge检测 附加资源 在本章中,我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法。它由John F. Canny发明 1.这是一个多阶段算法,我们将经历每个阶段。 2.降…

C 练习实例19

题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如61+2+3.编程找出1000以内的所有完数。 程序分析:请参照:C 练习实例14。 步骤分析: 写一个函数判断是否是完数 找出…

Avalonia学习(十七)-CEF

今天开始继续Avalonia练习。 本节:CefNet 1.引入 CefNet.Avalonia.Eleven 2.项目引入 Program中加入 using Avalonia; using Avalonia.ReactiveUI; using Avalonia.Threading; using CefNet; using System; using System.IO; using System.Linq; using System…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-10奈奎斯特稳定性判据-Nyquist Stability Criterion

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-10奈奎斯特稳定性判据-Nyquist Stability Criterion Cauchy’s Argument Priciple 柯西幅角原理 结论: s s s平面内顺时针画一条闭合曲线 A A A, B B B曲…

Python从入门到网络爬虫(函数详解)

前言 函数是变成语言中最常见的语法,函数的本质就是功能的封装。使用函数可以大大提高编程效率与程序的可读性。函数是能够实现特定功能的计算机代码而已,他是一种特定的代码组结构。 函数的作用 1.提升代码的重复利用率,避免重复开发相同代…

【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题

代数学作业1-完整版:python实现GNFS一般数域筛 写在最前面背景在GNFS算法中选择互质多项式时,需要考虑哪些关键因素,它们对算法的整体运行时间有何影响? 练习1题目题目分析Kleinjung方法简介通用数域筛法(GNFS)中的多…

简易机器学习笔记(七)计算机视觉基础 - 常用卷积核和简单的图片的处理

前言 这里实际上涉及到了挺多有关有关理论的东西,可以详细看一下paddle的官方文档。不过我这里不过多的谈有关理论的东西。 【低层视觉】低层视觉中常见的卷积核汇总 图像处理中常用的卷积核 在代码中,我们实际上是用不同的卷积核来造成不同的影响&a…

从零开始搭建企业级前端项目模板(vue3+vite+ts)

文章目录 主要内容一、vite脚手架工具初始化项目二、项目代码加入eslint校验和自动格式化2.1安装对应依赖插件2.2 配置script脚本,项目安装eslint配置2.3 安装完成后,后面启动项目还缺少一些依赖,提前按需安装好 三,修改eslintrc.…

达梦数据:数字化时代,国产数据库第一股终于到来?

又是新的一年开始。回首一年前的此时,在大家千呼万唤地期待中,数据基础制度体系的纲领性文件正式发布。 时隔一年之后,数据资源入表如约而至。2024年1月1日《企业数据资源相关会计处理暂行规定》正式施行,各行各业海量数据巨大的…

隔离式双向DC-DC 转换器介绍

1.前言 由于电力电子、数字控制及电池技术的进步,促使再生能源、储能系统及新能源应用等产业的蓬勃发展。例如 : 电动汽车的电能系统、对电力系统用电进行削峰填谷和调节电力的储能系统、应急电源及可携式行动电源等。这些设备都需要双向电力转换系统在电力系统与电…

5G阅信助力互联网行业:XX出行-出票通知,案例分析

XX出行日常有大量业务通知短信下发,用户触达频次和用户打开率都比较高,但原短信无法带来附加营销增值,通过阅信增值服务消息将两者结合起来,可实现业务的多渠道引流,开拓了新的渠道和方式。 项目概述: 1. 项…