从《离婚律师》中学习代理模式

〇、前言

在2014年的时候,有一部非常火爆的电视剧叫做《离婚律师》,里面讲述了两名离婚律师池海东罗郦的爱恨情仇,片子非常好看,当时我自己也怒刷了好几遍。

那么,在本剧的第四集中,有一段非常搞笑的剧情:

美玉给罗郦介绍了吕晨,也就是自己婚礼的伴郎,让两人相亲。巧的是,罗郦(姚晨扮演)和吕晨(李晨扮演)相亲时,池海东正和助理小刚在隔壁桌谈事情。吕晨说起罗郦在法庭上大败池海东的事,碰巧被池海东听见,他大为光火。吕晨和罗郦非常聊得来,吕晨说的一切有关未来婚姻生活的畅想,罗郦都很中意,可是吕晨居然总结了一句万事俱备只欠离婚。原来他有老婆,正在打离婚,他想请罗郦做自己的代理律师。罗郦气得转身就走,池海东却向吕晨递上名片,表示自己很有兴趣接他的案子……

本来是个男方的甜蜜相亲局,竟然被对方邀请作为离婚案件的代理律师,这一肚子气,真够受的了。那为什么需要代理律师呢? 因为吕晨对法律章程并不熟知,所以他需要代理律师帮着他去处理离婚案件,那么如果在过程中,如果需要客户提供一些个人信息的时候,再由代理律师去找吕晨即可。所以,代理律师就成为了吕晨与法官之间的一个必不可少的环节了

代理律师的作用我们大致了解了,那么,这与我们今天要介绍的代理模式有什么关系呢?其主要的重点就在代理上了。当我们想要基于某个对象上再增加一些逻辑操作的时候,我们就可以是用代理模式了。真实对象与代理对象同属一个接口,那么,对于客户来说,也是无感知的了。下面我们来进入正题,好好聊一聊这个代理模式。

一、模式定义

代理模式的定义如下所示:

代理模式为另一个对象提供一个替身占位符,以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。在SpringAOP中采用的JDK动态代理,就是最典型的例子。

代理模式所解决的问题:

当我们想要对一个业务类进行某些横切性的增强时,例如:增加请求与响应的日志、增加权限校验、增加远程请求对象封装等等。我们可以采用代理模式去实现,而不需要修改原有的类。

二、类图

在代理模式中,我们需要两个对象:真实对象代理对象;那么对于客户来说呢,他们其实并不在意是真实对象还是代理对象,他们只是需要这个对象可以实现某些行为即可。所以,为了让客户的操作“无感知”,我们就需要真实对象与代理对象是属于同一个接口。这样,当我们基于接口编程的时候,在客户眼中,他操作的只是这个接口的某个方法而已。

下面我们来看一下代理模式的通用类图,其中Subject是一个接口,真实对象RealSubject和代理对象Proxy都实现了这个接口,为了可以具有真实对象的能力,需要将真实对象RealSubject组合到代理对象Proxy中,具体类图如下所示:

6.3> 类的实现

实现真实对象与代理对象的统一接口Subject

public interface Subject {void request();
}

实现Subject接口,创建真实对象RealSubject

public class RealSubject implements Subject {@Overridepublic void request() {System.out.println("-----RealSubject 开始执行业务操作-----");}
}

实现Subject接口,创建代理对象Proxy

public class Proxy implements Subject {// 被代理的对象private Subject subject;public Proxy(Subject subject) {this.subject = subject;}@Overridepublic void request() {beforeProcessor();subject.request();afterProcessor();}private void beforeProcessor() {System.out.println("-----Proxy before processor-----");}private void afterProcessor() {System.out.println("-----Proxy after processor-----");}
}

实现测试类ProxyTest

public class ProxyTest {public static void main(String[] args) {Subject subject = new Proxy(new RealSubject());subject.request();}
}

通过输出结果我们可以看到,客户调用的request()方法,其实是代理对象Proxyrequest()方法:

-----Proxy before processor-----
-----RealSubject 开始执行业务操作-----
-----Proxy after processor-----Process finished with exit code 0

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

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

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

相关文章

docker 04.更加重要的命令

之前的都是基础命令, 前台交互进程和后台守护进程: 重新进入容器: docker中的导入导出: docker中的拷贝到:

AliOS-Things引入

目录 一、简介 1.1 硬件抽象层 1.2 AliOS-Things内核 rhino ​编辑 1.3 AliOS-Things组件 二、如何进行AliOS-Things开发 三、安装环境 安装python pip git 修改pip镜像源 安装aos-cube 一、简介 AliOS-Things是阿里巴巴公司推出的致力于搭建云端一体化LoT软件。AliOS-…

centos升级python3.10,中间遇到问题,终于解决了

升级为python3.10 yum updateyum install openssl-devel bzip2-devel libffi-develyum groupinstall "Development Tools"wget https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgztar -xzf Python-3.10.2.tgzcd Python-3.10.2./configure --enable-optimi…

Spring Boot Actuator的Env端点存在本地文件包含(LFI)漏洞CVE-2020-5421

文章目录 0.前言1.参考文档2.基础介绍3.漏洞利用原理3.解决方案1. 升级Spring Boot版本2. 限制端点的访问3. 禁用环境端点4. 不公开敏感的Actuator端点5. 开启安全审计 0.前言 背景: Spring Boot Actuator的Env端点存在本地文件包含(LFI)漏洞CVE-2020-5421。被扫描到…

Pytorch学习:神经网络模块torch.nn.Module和torch.nn.Sequential

文章目录 1. torch.nn.Module1.1 add_module(name,module)1.2 apply(fn)1.3 cpu()1.4 cuda(deviceNone)1.5 train()1.6 eval()1.7 state_dict() 2. torch.nn.Sequential2.1 append 3. torch.nn.functional.conv2d 1. torch.nn.Module 官方文档…

沉浸式VR虚拟实景样板间降低了看房购房的难度

720 全景是一种以全景视角为特点的虚拟现实展示方式,它通过全景图像和虚拟现实技术,将用户带入一个仿佛置身其中的沉浸式体验中。720 全景可以应用于旅游、房地产、展览等多个领域,为用户提供更为直观、真实的体验。 在房地产领域&#xff0c…

node-red - 读写操作redis

node-red - 读写操作redis 一、前期准备二、node-red安装redis节点三、node-red操作使用redis节点3.1 redis-out节点 - 存储数据到redis3.2 redis-cmd节点 - 存储redis数据3.3 redis-in节点 - 查询redis数据 附录附录1:redis -out节点示例代码附录2:redi…

Java eight 解读流(Stream)、文件(File)、IO和异常处理的使用方法

目录 Java 流(Stream)、文件(File)和IO读取控制台输入读写文件FileInputStreamFileOutputStream Java目录 Java 异常处理 Java 流(Stream)、文件(File)和IO java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种…

matlab-对数据集加噪声并实现tsne可视化

matlab-对数据集加噪声并实现tsne可视化 最近才知道,原来可以不用模型,也能实现对数据集数据的可视化。 **一、**以COIL-100数据集为例子。 问题: 前提:首先对COIL-100数据集根据角度0-175和180-255,分别划分成C1,C…

c++学习之vector的实现

在学习实现vector之前我们会看到对于库中的vector的实现,这里并非使用在学习string那样的定义方式,而是利用迭代器,也就是指针来实现的,这在功能的实现时极大的方便了我们。 那么我们就模仿库这样的方式实现我们呢经常会用到的一些…

PowerBuilder连接SQLITE3

PowerBuilder,一个古老的IDE,打算陆续发些相关的,也许还有人需要,内容可能涉及其他作者,但基本都是基于本人实践整理,如涉及归属,请联系. SQLite,轻型数据库,相对与PowerBuilder来说是个新事务,故发数来,以供参考. PB中使用OLE Microsoft OLE DB方式进行连接,如下 // Profile…

邮件群发的功能特性

自动切换IP登录多账户发送 保证第三方发件邮箱系统发送成功率 由于第三方免费邮箱如同个IP登录多个163账号会造成被屏蔽的问题,我们采用自动拨号vps的方式可全国多个地区自动拨号切换IP,自动保证每个账号同时只登录一个账号发送,更可以多种类型小号混合…

kafka+Kraft模式集群+安全认证

Kraft模式安全认证 前章内容聊到了Kafka的Kraft集群的配置及使用。本篇再来说说kafka的安全认证方面的配置,。 Kafka提供了多种方式来进行安全认证,包括身份认证、授权和加密传输。一些常用的Kafka安全认证方式: SSL/TLS:使用S…

数据库的基本概念

数据库 数据库由表集合组成,它是以一定的组织方式存储的相互有关的数据集合。 表:记录:行,字段(属性):列,以行列的形式就组成了表(数据存储在表中)。 关系数…

学术加油站|基于端到端性能的学习型基数估计器综合测评

编者按 本文系东北大学李俊虎所著,也是「 OceanBase 学术加油站」系列第 11 篇内容。 「李俊虎:东北大学计算机科学与工程学院在读硕士生,课题方向为数据库查询优化,致力于应用 AI 技术改进传统基数估计器,令数据库选…

【LeetCode】3. 无重复字符的最长子串

3. 无重复字符的最长子串(中等) 方法:滑动窗口 哈希表 思路 这道题主要用到思路是:滑动窗口 什么是滑动窗口? 其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 ab…

版本控制 Git工具的使用

版本控制的概念: 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。简单来说就是用于管理多人协同开发…

LeetCode--HOT100题(46)

目录 题目描述:114. 二叉树展开为链表(中等)题目接口解题思路代码 PS: 题目描述:114. 二叉树展开为链表(中等) 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链…

【Flutter】Flutter 使用 collection 优化集合操作

【Flutter】Flutter 使用 collection 优化集合操作 文章目录 一、前言二、安装和基本使用三、算法介绍四、如何定义相等性五、Iterable Zip 的使用六、优先队列的实现和应用七、包装器的使用八、完整示例九、总结 一、前言 大家好!我是小雨青年,今天我要…

windows 中pycharm中venv无法激活

1.用管理员身份打开Windows PowerShell 2.进入项目的:venv\Scripts 如:D: (1): cd .\project\venv\Scripts\ (2): 执行命令: Set-ExecutionPolicy RemoteSigned (3): 选择:Y (4): .\activate