【软考】设计模式之代理模式

news2024/11/16 8:40:20

目录

          • 1. 说明
          • 2. 应用场景
          • 3. 结构图
          • 4. 构成
          • 5. 适用性
          • 6. 优点
          • 7. 缺点
          • 8. java示例

1. 说明
  • 1.代理模式(Proxy Pattern)。
  • 2.意图:为其他对象提供一种代理以控制对这个对象的访问。
  • 3.通过提供与对象相同的接口来控制对这个对象的访问。
  • 4.是设计模式中的一种结构型模式
  • 5.创建了一个代表其他对象的代理对象,从而可以在不修改原始对象的基础上控制访问和附加操作。
2. 应用场景
  • 1.远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是同一台主机中的不同程序,也可以是网络上的不同主机。
  • 2.虚拟代理(Virtual Proxy):根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
  • 3.保护代理(Protect or Access Control Proxy):控制对原始对象的访问。
  • 4.智能引用(Smart Reference Proxy):当访问一个对象时,代理可以自动地处理一些附加操作,如:访问统计、安全检查等。
3. 结构图

在这里插入图片描述

4. 构成
  • 1.代理(Proxy)角色:保存一个引用使得代理可以访问实体;提供一个与 Subiect 的接口相同的接口,使代理可以用来代替实体;控制对实体的存取,并可能负责创建和删除它;其他功能依赖于代理的类型:Remote Proxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求;Virtual Proxy 可以缓存实体的附加信息,以便延迟对它的访问;Protection Proxy 检查调用者是否具有实现一个请求所必需的访问权限。持有一个真实对象的引用,负责代理真实对象,并在真实对象处理前或处理后进行附加操作。
  • 2.抽象主题(Subject)角色:定义 RealSubject 和 Proxy 的共用接口,这样就在任何使用 RealSubject 的地方都可以使用 Proxy。
  • 3.真实主题(Real Subject)角色:定义 Proxy 所代表的实体。
5. 适用性
  • 1.Proxy 模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候。
  • 2.远程代理(Remote Proxy):为一个对象在不同地址空间提供局部代表。
  • 3.虚代理(Virtual Proxy):根据需要创建开销很大的对象。
  • 4.保护代理(Protection Proxy):控制对原始对象的访问,用于对象应该有不同的访问权限的时候。
  • 5.智能引用(Smart Reference):取代了简单的指针,它在访问对象时执行一些附加操作。典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以被自动释放;当第一次引用一个持久对象时,将它装入内存;在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
6. 优点
  • 1.职责清晰:真实对象只关注业务逻辑,代理对象只关注非业务逻辑。
  • 2.高扩展性:可以在不修改真实对象的前提下扩展功能。
  • 3.智能化:代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象对目标对象进行封装和控制。
7. 缺点
  • 1.代理类和委托类实现相同的接口,增加了额外的编程工作量和复杂性。
  • 2.对于静态代理,如果接口增加方法,则代理类和目标类都需要进行修改,增加了代码的维护成本。
8. java示例
  • 1.卖票抽象主题角色
package com.learning.proxy;

/**
 * 抽象主题角色
 */
interface TicketSubject {
    void buyTicket(String userId);
}
  • 2.卖票真实主题角色
package com.learning.proxy;

/**
 * 真实主题角色
 */
class RealTicketSubject implements TicketSubject {
    @Override  
    public void buyTicket(String userId) {
        System.out.println("用户:" + userId + "买票中");
    }
}
  • 3.代理角色
package com.learning.proxy;

/**
 * 代理模式:代理类
 */
public class ProxyTicket implements TicketSubject {

    private RealTicketSubject realTicketSubject;
  
    public ProxyTicket(RealTicketSubject realTicketSubject) {
        this.realTicketSubject = realTicketSubject;
    }  
  
    @Override  
    public void buyTicket(String userId) {
        // 前置条件检查,例如验证用户权限  
        if (!isUserAuthorized(userId)) {  
            System.out.println("用户"+userId+"无购票权限");
            return;  
        }  
  
        // 记录日志  
        System.out.println("用户" + userId + "准备买票");
  
        // 调用真实票务服务购票
        realTicketSubject.buyTicket(userId);

        // 记录日志
        System.out.println("用户" + userId + "买票成功");
  
        // 购票后的处理,如发送通知等  
        sendPurchaseNotification(userId);
    }  
  
    private boolean isUserAuthorized(String userId) {  
        return userId.startsWith("VIP");
    }  
  
    private void sendPurchaseNotification(String userId) {
        System.out.println("用户" + userId+"已购票成功");
    }
}
  • 4.客户端
package com.learning.proxy;

public class Client {
    public static void main(String[] args) {  
        RealTicketSubject realTicketSubject = new RealTicketSubject();
        ProxyTicket proxyTicket = new ProxyTicket(realTicketSubject);
  
        // 模拟用户购票  
        proxyTicket.buyTicket("VIP123");
        proxyTicket.buyTicket("NORMAL456");
    }  
}
  • 7.示例截图

在这里插入图片描述

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

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

相关文章

kali——wpscan的使用

目录 前言 查看帮助(-h) ​编辑 常规扫描(--url) 破解用户名和密码 插件枚举 扫描插件漏洞 扫描主题漏洞 前言 wpscan 是 Kali Linux 自带工具,主要用于扫描WordPress网站的各种安全漏洞,包括Word…

深度学习TensorFlow框架

深度学习介绍 深度学习和机器学习区别 机器有人工参与,而深度学习是靠网络; 深度学习需要大量的数据集,训练神经网络需要大量的算力 机器学习有:朴素贝叶斯,决策树等 深度学习主要是神经网络 深度学习应用场景 CV&…

[数据集][目标检测]轮胎缺陷检测数据集VOC+YOLO格式2154张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2154 标注数量(xml文件个数):2154 标注数量(txt文件个数):2154 标注…

【爬虫软件】小红薯评论区采集工具

一、采集目标与应用场景 您好!我利用Python技术自主研发了一款高效的爬虫软件,批量收集小红薯平台上的评论,包括主评论及其下的二级评论。 为了拓宽用户群体,让不具备编程基础的小白用户也能轻松上手,我开发成了界面…

Burp Suite Professional 2024.8 for macOS x64 ARM64 - 领先的 Web 渗透测试软件

Burp Suite Professional 2024.8 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件 世界排名第一的 Web 渗透测试工具包 请访问原文链接:https://sysin.org/blog/burp-suite-pro-mac/,查看最新版。原创作品,转载请保留出处。 作者主页…

设计模式-装饰器代理观察者

3.7 装饰器模式(代码见vs) 装饰器又叫做包装模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法完整性的前提下,提供了额…

基于Android Studio的行程记录APK开发指南(二):熟悉一个项目结构

前言 最近博主在unity开发独立游戏,UE5系列的相关长期教程先暂时不更新了,请大家多多谅解本系列教程我们来看看如何使用Android Studio去开发一个APK用于用户的实时行程记录 第一期:基于Android Studio的用户行程记录APK开发指南(一):项目基…

CTF---密码学知识点总结

✨Ascall编码:在 ctf 比赛中,flag 的标志一般是以 Ascall 码的形式存在,其对应的码值为102,108,97,103(其中{的码值是123)! ✨Unicode编码:又名万国码&#…

OpenHarmony持久化存储UI状态:PersistentStorage

前两个小节介绍的LocalStorage和AppStorage都是运行时的内存,但是在应用退出再次启动后,依然能保存选定的结果,是应用开发中十分常见的现象,这就需要用到PersistentStorage。 PersistentStorage是应用程序中的可选单例对象。此对…

海外云服务器安装 MariaDB10.6.X (Ubuntu 18.04 记录篇二)

本文首发于 秋码记录 MariaDB 的由来(历史) 谈起新秀MariaDB,或许很多人都会感到陌生吧,但若聊起享誉开源界、业界知名的关系型数据库——Mysql,想必混迹于互联网的人们(coder)无不知晓。 其…

C++中protobuffer的具体使用方法以及重要原理的实现

一、protobuffer的具体使用 对于基本的知识可以看我之前的文章。 那一片文章主要是知识点,这一片是实战。 1、头部 我们通过syntax 这个来指定版本号,如果不写的话就会默认为proto2,2这个版本是一个比较旧的版本。旧的版本写起来就比较繁琐。…

地平线Sparse4D论文解析(含论文原文)

0. 摘要 在自动驾驶感知系统中,3D 检测和跟踪是两个基本任务。本文深入研究了这一领域,并在 Sparse4D 框架的基础上进行了扩展。我们引入了两个辅助训练任务(时间实例去噪和质量估计),并提出了解耦注意力机制&#xf…

智能计算方法与实现2|模拟退火算法原理|工具箱及其应用

模拟退火算法原理 模拟退火算法 模拟退火算法(SimulatedAnnealing,SA)最早的思想是由N.Metropolis等人于1953年提出。 1983年,S.Kirkpatrick等成功地将退火思想引l入到组合优化领域 它是基于Monte-Carlo送代求解策略的一种随机寻…

MATLAB 仿真跳频扩频通信系统

1. 简介 跳频扩频(FHSS)是一种通过在不同的频率之间快速切换来对抗窄带干扰的技术。在这篇博客中,我们将使用 MATLAB 进行 FHSS 通信系统的仿真,模拟跳频过程、调制、解调以及信号在不同步骤中的变化。通过对仿真结果进行可视化&…

为虚拟机配置固定的IP地址(CentOS9)

配置虚拟网卡 首先关闭虚拟机 打开虚拟网络编辑器 选择更改配置 选择VMnet8,选择子网的IP和掩码 (这里的子网掩码为255.255.255.0,表示前24位为网络号,后8位为主机号)然后点击DHCP设置 设置开始IP地址和结束IP地址&…

远端ide ,vscode ,python 开发环境, 有些还有一建生成chatgpt功能,支持gpu功能

现在智能化的AI工具,可以实现智能聊天、文本生成、语言翻译等多种功能。 博主归纳总结了6个好用免费的AI工具网站,供大家参考。 ## 1,insCode 网址: https://inscode.csdn.net/ 简介: InsCode 是一个以“灵感”&am…

【知识点】图论续篇 - 最短路算法合集

我不会跟大家说我两个月前就写好了,只是今天才发出来。 本文概述 最短路算法,见名知意,就是用于求出图中从某个顶点到另一个顶点最短距离的算法。最短路算法的应用极其广泛。本文将会以求解最短路为中心,围绕着展开叙述一些常见的…

高清无损!探索PDF转JPG的最佳实践工具

在信息爆炸的今天,PDF文件因其跨平台兼容性和文档保护特性,成为了工作、学习和日常生活中不可或缺的一部分。但是很多时候我们并不需要精度那么高的文件,图片分享更符合快捷的要求。这次我们就一起探讨有什么PDF转jpg的工具吧。 1.福昕PDF转…

SignalR——聊天室实践

SignalR 是一个为 ASP.NET 开发者设计的库,它简化了在 Web 应用程序中添加实时功能的过程。实时功能指的是服务器能够在客户端没有发起请求的情况下主动向客户端推送内容的能力。这种技术使得服务器和客户端之间的通信更加动态和即时,非常适合需要实时更…

iOS P8证书推送测试

最近在配合服务端人员调试相关的 APNS auth key 推送的问题,相比于苹果的P12证书的推送,P8证书的推送显得方便很多,P8的优势在于简单,安全 容易生成 最重要的是不会过期。 现在我们来看下测试具体流程: 方法一 地址…