结构设计模式 - 代理设计模式 - JAVA

news2025/1/21 0:56:19

代理设计模式

    • 一. 介绍
    • 二. 代码示例
      • 2.1 定义 CommandExecutor 类
      • 2.2 定义 CommandExecutorProxy代理类
      • 2.3 模拟客户端
      • 2.4 测试结果
    • 三. 结论

前言
这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一. 介绍

官方话语:

代理模式的定义:**为其他对象提供一种代理以控制对这个对象的访问。**在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

我的理解:

代理模式就是需要我们创建一个可以方便两端沟通的桥梁,然后我们可以在这两端之间做一下控制,比如房产中介,比如火车站买票代理点等等 。那么这个定义就非常清晰,当我们想要对提供功能的进行受访控制时,可以使用代理设计模式。

所以代理模式会分为以下三种角色:

(1)抽象(Subject)角色:通过接口或抽象类声明真实角色实现的业务方法。

(2)代理(Proxy)角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

(3)真实(Real Subject)角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

二. 代码示例

具体案例:

假设我们创建了某个CommandExecutor 类,他的作用是可以运行某些linux命令的。这个类一开始是我们程序内部使用,现在需要提供出来给其他客户端程序使用,那么这时候就需要做限制,因为客户端程序可以发出一些危险命令删除某些系统文件更改某些您不想要的设置。为了做好限制,我们可以创建一个代理类 CommandExecutorProxy来提供程序的受控访问。关系如下图所示

image-20240531145325487

2.1 定义 CommandExecutor 类

定义接口

/**
 * @author chenyunzhi
 */
public interface CommandExecutor {

    /**
     * 执行命令
     * @param cmd 命令
     */
    void exec(String cmd);
}

实现接口,这里是编写我们内部使用的类

/**
 * @author chenyunzhi
 * @date 2024/5/31 14:25
 * @Description
 */
public class CommandExecutorImpl implements CommandExecutor{
    @Override
    public void exec(String cmd) {
        System.out.println("执行了" + cmd);
    }
}

2.2 定义 CommandExecutorProxy代理类

/**
 * @author chenyunzhi
 * @date 2024/5/31 14:28
 * @Description
 */
public class CommandExecutorProxy implements CommandExecutor{

    private boolean admin;
    private final CommandExecutor commandExecutor;
    
    public CommandExecutorProxy() {
        commandExecutor = new CommandExecutorImpl();
    }
    
    public CommandExecutorProxy(String user, String password) {
        // 需要输入正确账号密码才能获得管理员权限
        if ("admin".equals(user)  && "123456".equals(password)) {
            admin = true;
        }
        commandExecutor = new CommandExecutorImpl();
    }
    @Override
    public void exec(String cmd) {
        if (!admin) {
            if (cmd.startsWith("rm")) {
                System.out.println(cmd + "没有权限执行");
                return;
            }
        }
        commandExecutor.exec(cmd);
    }
}

2.3 模拟客户端

/**
 * @author chenyunzhi
 * @date 2024/5/31 14:41
 * @Description  客户端
 */
public class ProxyDesignPatternTest {
    public static void main(String[] args) {

        System.out.println("-----------普通用户执行命令-----------");
        CommandExecutorProxy commandExecutorProxy = new CommandExecutorProxy();

        commandExecutorProxy.exec("ls");

        commandExecutorProxy.exec("rm");

        System.out.println("-------------管理员执行命令-----------");

        commandExecutorProxy = new CommandExecutorProxy("admin", "123456");

        commandExecutorProxy.exec("ls");

        commandExecutorProxy.exec("rm");

    }

}

2.4 测试结果

image-20240531145110303

可以看到普通用户是没有权限执行rm,管理员就能够执行,这样子comandExecutorProxy类就起到了一个代理的作用

三. 结论

  1. 代理设计模式的常见用途是访问控制或提供包装器实现以获得更好的性能。Java RMI 包使用代理模式。

使用场景:

  1. 远程(Remote)代理

    本地服务通过网络请求远程服务。为了实现本地到远程的通信,我们需要实现网络通信,处理其中可能的异常。为良好的代码设计和可维护性,我们将网络通信部分隐藏起来,只暴露给本地服务一个接口,通过该接口即可访问远程服务提供的功能,而不必过多关心通信部分的细节。

  2. 防火墙(Firewall)代理

    当你将浏览器配置成使用代理功能时,防火墙就将你的浏览器的请求转给互联网;当互联网返回响应时,代理服务器再把它转给你的浏览器。

  3. 保护(Protect or Access)代理

    控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。

参考文章: https://www.digitalocean.com/community/tutorials/decorator-design-pattern-in-java-example#decorator-design-pattern

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(三)循环链表 约瑟夫环

文章目录 一、循环链表(一)概念(二)示意图(三)操作1. 创建循环链表(1)函数声明(2)注意点(3)代码实现 2. 插入(头插&#x…

【数据分享】中国劳动统计年鉴(1991-2023)

大家好!今天我要向大家介绍一份重要的中国劳动统计数据资源——《中国劳动统计年鉴》。这份年鉴涵盖了从1991年到2023年中国劳动统计全面数据,并提供限时免费下载。(无需分享朋友圈即可获取) 数据介绍 1991年以来,中…

玄机平台应急响应—Linux日志分析

1、前言 啥是日志呢,日志就是字面意思,用来记录你干了啥事情。日志大体可以分为网站日志和系统日志,网站日志呢就是记录哪个用户在哪里什么时候干了啥事,以及其它的与网站相关的事情。系统日志呢,就是记录你的电脑系统…

飞腾+FPGA多U多串全国产工控主机

飞腾多U多串工控主机基于国产化飞腾高性能8核D2000处理器平台的国产自主可控解决方案,搭载国产化固件,支持UOS、银河麒麟等国产操作系统,满足金融系统安全运算需求,实现从硬件、操作系统到应用的完全国产、自主、可控,是国产金融信…

【计算机毕设】基于SpringBoot的房产销售系统设计与实现 - 源码免费(私信领取)

免费领取源码 | 项目完整可运行 | v:chengn7890 诚招源码校园代理! 1. 研究目的 随着房地产市场的发展和互联网技术的进步,传统的房产销售模式逐渐向线上转移。设计并实现一个基于Spring Boot的房产销售系统&#xff0…

用HAL库改写江科大的stm32入门-6-3 PWM驱动LED呼吸灯

接线图: 2 :实验目的: 利用pwm实现呼吸灯。 关键PWM定时器设置: 代码部分: int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*…

神经网络---卷积神经网络CNN

一、从前馈神经网络到CNN 前馈神经网络(Feedforward Neural Networks)是最基础的神经网络模型,也被称为多层感知机(MLP)。 它由多个神经元组成,每个神经元与前一层的所有神经元相连,形成一个“…

【C语言】基于C语言实现的贪吃蛇游戏

【C语言】基于C语言实现的贪吃蛇游戏 🔥个人主页:大白的编程日记 🔥专栏:C语言学习之路 文章目录 【C语言】基于C语言实现的贪吃蛇游戏前言一.最终实现效果一.Win32 API介绍1.1Win32 API1.2控制台程序1.3控制台屏幕上的坐标COORD…

【kubernetes】探索k8s集群的存储卷、pvc和pv

目录 一、emptyDir存储卷 1.1 特点 1.2 用途 1.3部署 二、hostPath存储卷 2.1部署 2.1.1在 node01 节点上创建挂载目录 2.1.2在 node02 节点上创建挂载目录 2.1.3创建 Pod 资源 2.1.4访问测试 2.2 特点 2.3 用途 三、nfs共享存储卷 3.1特点 3.2用途 3.3部署 …

放开了去的 ulimit

放开了去的 ulimit 放开了去的 ulimitulimit简介临时修改打开文件数目永久修改系统总打开句柄限制更多信息 放开了去的 ulimit ulimit简介 对于高并发或者频繁读写文件的应用程序而言,有时可能需要修改系统能够打开的最多文件句柄数,否则就可能会出现t…

【网络原理】HTTP|认识请求“报头“|Host|Content-Length|Content-Type|UA|Referer|Cookie

目录 认识请求"报头"(header) Host Content-Length Content-Type User-Agent(简称UA) Referer 💡Cookie(最重要的一个header,开发&面试高频问题) 1.Cookie是啥? 2.Cookie怎么存的? …

系统架构设计师【第8章】: 系统质量属性与架构评估 (核心总结)

文章目录 8.1 软件系统质量属性8.1.1 质量属性概念8.1.2 面向架构评估的质量属性8.1.3 质量属性场景描述 8.2 系统架构评估8.2.1 系统架构评估中的重要概念8.2.2 系统架构评估方法 8.3 ATAM方法架构评估实践8.3.1 阶段1—演示(Presentation)8.3…

卷积网络迁移学习:实现思想与TensorFlow实践

摘要:迁移学习是一种利用已有知识来改善新任务学习性能的方法。 在深度学习中,迁移学习通过迁移卷积网络(CNN)的预训练权重,实现了在新领域或任务上的高效学习。 下面我将详细介绍迁移学习的概念、实现思想&#xff0c…

SpringMVC响应数据 View

1.如何封装数据返回页面 使用ModelAndView: ModelAndView modelAndView new ModelAndView() modelAndView.addObject() 方法封装数据 使用Controller中内置Model对象 model: model.addAttribute("name","zz"); 2.跳转的方式…

el-date-picker的使用,及解决切换type时面板样式错乱问题

这里选择器的类型可以选择日月年和时间范围&#xff0c;根据类型不同&#xff0c;el-date-picker的面板也展示不同&#xff0c;但是会出现el-date-picker错位&#xff0c;或者面板位置和层级等问题。 源代码&#xff1a; <el-selectv-model"dateType"placeholder&…

【PTA】7-4 朋友圈(C++ * 并查集思想)代码实现 一点反思

题目如下&#xff1a; AC代码如下&#xff08;参考PTA 7-2 朋友圈&#xff08;25 分&#xff09;_处理微信消息pta-CSDN博客&#xff09; #include<bits/stdc.h> using namespace std; #define sz 30005 typedef struct node{int rk, fa; }Node; Node tree[sz]; void In…

HTTPS 原理技术

HTTPS原理技术 背景简介原理总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内容并非完全原创&am…

Ubuntu安装GCC编译器

GCC编译器安装 GCC编译器安装切换软件源(换成国内的服务器)1 、创建一个文本文档并命名为“sources.list”2 、复制软件源列表清华源:阿里源:3 、把修改之后的.list 文件覆盖原有的文件4 、更新软件列表5 、安装6 、检查是否安装成功7、GCC 编译器:GCC编译器安装 这里演示…

二维数组传参时不用二级指针接收

先放结论&#xff1a; 1. 二维数组数组名指向的类型是 int [x] 类型&#xff0c;int** 指针指向类型是 int* &#xff0c;如果用二级指针接收会导致访问错误&#xff0c;因为 int [x] 类型和 int* 类型不同。 2. 指向什么类型的指针1就按照该类型的字节数1移动。 最近在学…

高并发项目-分布式Session解决方案

分布式Session解决方案 1.保存Session&#xff0c;进入商品列表页面 1.保存Session 1.编写工具类 1.MD5Util.java package com.sxs.seckill.utils;import org.apache.commons.codec.digest.DigestUtils;/*** Description: MD5加密工具类** Author sun* Create 2024/5/5 14…