设计模式之代理模式解析(上)

news/2024/4/19 13:47:36/文章来源:https://blog.csdn.net/m0_50186249/article/details/137258601
代理模式
1)概述
1.定义

给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。

2.作用

当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。

3.结构图

在这里插入图片描述

4.角色
  • Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。

  • Proxy(代理主题角色):它包含了对真实主题的引用,可以在任何时候操作真实主题对象;在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题;代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。

  • RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。

5.代码案例

抽象主题类

abstract class Subject{public abstract void Request();
}

真实主题类

public class RealSubject extends Subject{@Overridepublic void Request(){//业务方法具体实现代码}
}

代理类

public class Proxy extends Subject{//维持一个对真实主题对象的引用private RealSubject realSubject = new RealSubject();public void PreRequest() {//...}@Overridepublic void Request() {PreRequest();//调用真实主题对象的方法realSubject.Request(); PostRequest();}public void PostRequest() {//...}
}
2)分类

远程代理(Remote Proxy):为一个位于不同地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中。

虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,可以先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。

保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。

缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外的操作,例如将对象被调用的次数记录下来等。

3)简单案例
1.结构图

在这里插入图片描述

业务类AccessValidator用于验证用户身份,业务类Logger用于记录用户查询日志,Searcher充当抽象主题角色,RealSearcher充当真实主题角色,ProxySearcher充当代理主题角色。

2.代码案例

AccessValidator:身份验证类,业务类,它提供方法Validate()来实现身份验证。

public class AccessValidator {//模拟实现登录验证public boolean Validate(String userId) {System.out.println("在数据库中验证用户'" + userId + "'是否是合法用户?");if (userId.equals("杨过")) {System.out.println("登录成功!"+userId);return true;} else {System.out.println("登录失败!"+userId);return false;}}
}

Logger:日志记录类,业务类,它提供方法Log()来保存日志。

public class Logger {//模拟实现日志记录public void Log(String userId) {System.out.println("更新数据库,用户查询次数加1!用户为 "+userId);}
}

Searcher:抽象查询类,充当抽象主题角色,它声明了DoSearch()方法。

public interface Searcher {String DoSearch(String userId, String keyword);
}

RealSearcher:具体查询类,充当真实主题角色,它实现查询功能,提供方法DoSearch()来查询信息。

public class RealSearcher implements Searcher {@Overridepublic String DoSearch(String userId, String keyword) {System.out.println("用户="+userId+"使用关键词查询"+keyword+"商务信息!");return "返回具体内容";}
}

ProxySearcher:代理查询类,充当代理主题角色,它是查询代理,维持了对RealSearcher对象、AccessValidator对象和Logger对象的引用。

public class ProxySearcher implements Searcher {//维持一个对真实主题的引用private RealSearcher searcher = new RealSearcher(); private AccessValidator validator;private Logger logger;public String DoSearch(String userId, String keyword) {//如果身份验证成功,则执行查询if (this.Validate(userId)) {//调用真实主题对象的查询方法String result = searcher.DoSearch(userId, keyword);//记录查询日志this.Log(userId);//返回查询结果return result; } else {return null;}}//创建访问验证对象并调用其Validate()方法实现身份验证public boolean Validate(String userId) {validator = new AccessValidator();return validator.Validate(userId);}//创建日志记录对象并调用其Log()方法实现日志记录public void Log(String userId) {logger = new Logger();logger.Log(userId);}
}

Program:客户端测试类

public class Program {public static void main(String[] args) {Searcher searcher;searcher = new ProxySearcher();String result = searcher.DoSearch("杨过", "玉女心经");System.out.println(result);}
}

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

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

相关文章

ssm018简易版营业厅宽带系统+jsp

营业厅宽带系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生,其可以帮助管理者在短时间…

Python快速入门系列-9(Python项目实战)

第九章:Python项目实战 9.1 开发一个简单的Web应用9.1.1 项目概述9.1.2 环境准备9.1.3 项目结构9.1.4 代码实现9.1.4.1 创建数据库模型9.1.4.2 创建视图9.1.4.3 实用工具函数9.1.4.4 运行应用9.1.5 模板设计9.2 数据分析与可视化项目9.2.1 项目概述9.2.2 环境准备9.2.3 数据分…

主干网络篇 | YOLOv8改进之用RCS-OSA替换C2f(来源于RCS-YOLO)

前言:Hello大家好,我是小哥谈。RCS-YOLO是一种目标检测算法,它是基于YOLOv3算法的改进版本。通过查看RCS-YOLO的整体架构可知,其中包括RCS-OSA模块。RCS-OSA模块在模型中用于堆叠RCS模块,以确保特征的复用并加强不同层之间的信息流动。本文就给大家详细介绍如何将RCS-YOLO…

使用Java流API构建树形结构数据

简介: 在实际开发中,构建树状层次结构是常见需求,如组织架构、目录结构或菜单系统。本教案通过解析给定的Java代码,展示如何使用Java 8 Stream API将扁平化的菜单数据转换为具有层级关系的树形结构。 1. 核心类定义 - Menu Data…

Day65-企业级防火墙iptables精讲1

Day65-企业级防火墙iptables精讲1 补充:1.什么是防火墙?2.防火墙种类2.1 商用防火墙介绍2.2 Linux下防火墙介绍 3.选择何种防火墙?4.企业级架构最佳防火墙场景5.学好iptables的技术栈基础6.Iptables是什么?7.Iptables企业常用场景…

Kafka架构概述

Kafka的体系结构 Kafka是由Apache软件基金会管理的一个开源的分布式数据流处理平台。Kafka具有支持消息的发布/订阅模式、高吞吐量与低延迟、持久化、支持水平扩展、高可用性等特点。可以将Kafka应用于大数据实时处理、高性能数据管道、流分析、数据集成和关键任务应用等场景。…

Java入门学习Day04

本篇文章主要介绍了:如何输入数据、字符串拼接、自增自减运算符、类型转换(int,double等) CSDN:码银 公众号:码银学编程 一、键盘输入练习 Scanner是Java中的一个类,用于从控制台或文件中读…

【Python BUG】ModuleNotFoundError: No module named ‘streamlit.cli‘

问题 streamlit做大模型前端demo,安装后不好使。 解决方案 参考: https://zhuanlan.zhihu.com/p/656164361 找到下面文件: 替换、修改内容: # from streamlit.cli import main from streamlit.web.cli import main原来是上边…

【HTML】注册页面制作 案例二

(大家好,今天我们将通过案例实战对之前学习过的HTML标签知识进行复习巩固,大家和我一起来吧,加油!💕) 案例复习 通过综合案例,主要复习: 表格标签,可以让内容…

力扣Lc26--- 1108. IP 地址无效化(java版)-2024年4月02日

1.题目描述 2.知识点 注1:首先,在Java中,字符类型应该使用单引号’,而不是双引号"。其次,修改字符数组中的元素应该使用单引号。 注2:String类的replace方法用于在字符串中替换指定的字符或字符序列。…

Java获取IP地址以及MAC地址(附Demo)

目录 前言1. IP及MAC2. 特定适配器 前言 需要获取客户端的IP地址以及MAC地址 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class test {public static void main(String[] args) {try {// 执行命令Process process…

158 Linux C++ 通讯架构实战13,epoll 原理和函数介绍,epoll_create,epoll_ctl ,epoll_wait

epoll技术简介 //(2.1)epoll概述 //(1)I/O多路复用:epoll就是一种典型的I/O多路复用技术:epoll技术的最大特点是支持高并发; //传统多路复用技术select,poll,在并发量达到1000-2000,性能就会明显下…

python爬取B站视频

参考:https://cloud.tencent.com/developer/article/1768680 参考的代码有点问题,请求头需要修改,上代码: import requests import re # 正则表达式 import pprint import json from moviepy.editor import AudioFileClip, Vid…

【热门话题】WebKit架构简介

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 WebKit架构简介一、引言二、WebKit概览1. 起源与发展2. 模块化设计 三、WebCore…

LabVIEW挖坑指南

一、挖坑指南 1.1、输出变量放在条件框内 错误写法: 现象:如果没进入对应的分支,输出为默认值 正常写法: 让每个分支输出的值都在预料之内。 1.2、统计耗时不准 错误写法 现象:统计出来的耗时是2000ms 正常写法&a…

PyQt qrc2py 使用PowerShell将qrc文件转为py文件并且将导入模块PyQt或PySide转换为qtpy模块开箱即用

前言 由于需要使用不同的qt环境(PySide,PyQt)所以写了这个脚本,使用找到的随便一个rcc命令去转换qrc文件,然后将导入模块换成qtpy这个通用库(支持pyside2-6,pyqt5-6),老版本的是Qt.py(支持pysi…

pygame--坦克大战(二)

加载敌方坦克 敌方坦克的方向是随机的,使用随机数生成。 初始化敌方坦克。 class EnemyTank(Tank):def __init__(self,left,top,speed):self.images {U: pygame.image.load(img/enemy1U.gif),D: pygame.image.load(img/enemy1D.gif),L: pygame.image.load(img/e…

搜维尔科技:SenseGlove Nova 允许以最简单的方式操作机器人并与物体交互

扩展 Robotics 和 QuarkXR 人机界面 XR 应用 Extend Robotics 利用扩展现实技术,让没有机器人专业知识的个人能够远程控制机器人。他们的 AMAS 解决方案使操作员能够不受地理限制地轻松控制机器人。 需要解决的挑战【搜维尔科技】 目前,操作机器人是一…

项目:USB键盘和鼠标的复合设备

我们的复合设备使用一个物理设备就可以完成多个功能。 使用复合设备同时完成USB键盘和鼠标功能,它的主要实现方式有两种, 第一个就是我们将多个设备描述符合并成一个,这个相对比较简单,我们只要根据相应的报告描述符处理数据就可…

OpenHarmony实战:轻量带屏解决方案之恒玄芯片移植案例

本文章基于恒玄科技 BES2600W 芯片的欧智通 Multi-modal V200Z-R 开发板,进行轻量带屏开发板的标准移植,开发了智能开关面板样例,同时实现了 ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF 等部件基于 OpenHarmony Lite…