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

代理模式
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.hqwc.cn/news/587657.html

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

相关文章

续-开发组件更新-提效工具分享

前言 小一个月没更新了,有各种各样的事啦,这一篇有点水吧。围绕两方面,开发组件更新以及IDEA插件的分享,题目和我一样水,有点像是日本轻小说取名了,整这么长。本篇的触动来源于,我今天偶然发现…

FPGA + 图像处理 (二) RGB转YUV色域、转灰度图及仿真

前言 具体关于色域的知识就不细说了,简单来讲YUV中Y通道可以理解为就是图像的灰度图,因此,将RGB转化为YUV是求彩色图的灰度直方图、进行二值化操作等的基础。 HDMI时序生成模块 这里先介绍一下仿真时用于生成HDMI时序,用这个时…

ArcGIS Pro打不开Excel?Microsoft驱动程序安装不上?

刚用ArcGIS pro的朋友们可能经常在打开xls或者xlsx文件的时候都会提示,未安装所需的Microsoft驱动程序。 怎么办呢?当然,按照提示装一下驱动就会好吗?有什么状况会出现?有什么临时替代方案呢? 全文目录&a…

Python读取Excel根据每行信息生成一个PDF——并自定义添加文本,可用于制作准考证

文章目录 有点小bug的:最终代码(无换行):有换行最终代码无bug根据Excel自动生成PDF,目录结构如上 有点小bug的: # coding=utf-8 import pandas as pd from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter from reportlab.pdfbase import pdf…

在flutter中添加video_player【视频播放插件】

添加插件依赖 dependencies:video_player: ^2.8.3插件的用途 在Flutter框架中,video_player 插件是一个专门用于播放视频的插件。它允许开发者在Flutter应用中嵌入视频播放器,并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…

LeetCode 19.删除链表的倒数第N个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出:[] 示例 3&#x…

STM32F4系列单片机的定时器讲解和计数器,PWM信号输出,PWM信号捕获的实现对电机进行控制和监测功能

1.定时器功能介绍: 在控制领域里面,我们可以用信号输出定时器,进行PWM的控制,从而达到控制电机的目的,通过输入捕获功能可以用来接收外部的数字信号,用于测量脉冲宽度、频率或周期等。在这里给大家介绍下&…

备考ICA----Istio实验15---开启 mTLS 自动双向认证实验

备考ICA----Istio实验15—开启mTLS自动双向认证实验 在某些生成环境下,我们希望微服务和微服务之间使用加密通讯方式来确保不被中间人代理. 默认情况下Istio 使用 PERMISSIVE模式配置目标工作负载,PERMISSIVE模式时,服务可以使用明文通讯.为了只允许双向 TLS 流量,…

文本自动粘贴编辑器:支持自动粘贴并筛选手机号码,让信息处理更轻松

在信息时代的浪潮中,文本处理已成为我们日常工作与生活的重要组成部分。无论是商务沟通、社交互动还是个人事务处理,手机号码的筛选与粘贴都显得尤为关键。然而,传统的文本处理方式效率低下、易出错,已无法满足现代人的高效需求。…

netty使用ChunkedWriteHandler发送TextWebSocketFrame消息导致内存溢出

netty版本 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.50.Final</version></dependency>此版本ChunkedWriteHandler 的write方法如下 public class ChunkedWriteHandler exten…

【tensorflow框架神经网络实现鸢尾花分类—优化器】

文章目录 1、前言2、神经网络参数优化器2.1、SGD2.2、SGDM2.3、Adagrad2.4、RMSProp2.5、Adam 3、实验对比不同优化器4、结果对比 1、前言 此前&#xff0c;在【tensorflow框架神经网络实现鸢尾花分类】一文中使用梯度下降算法SGD&#xff0c;对权重 w w w和偏置 b b b进行更新…

【系统技术演进】2018-2023

引子 2018-2023年&#xff0c;我所在的公司&#xff0c;架构上经历了数次转折、变化&#xff0c;在这个过程中&#xff0c;产生了很多对技术和职业的思考&#xff0c;仅以此来记录&#xff0c;在这个过程中所经历的&#xff0c;以及成长的过程和反思。 故事开始 1.混乱的Dubb…