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

〇、前言

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

null

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

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

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

null

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

一、模式定义

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

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

代理模式所解决的问题:

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

二、类图

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

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

null

6.3> 类的实现

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

csharp 复制代码
public interface Subject {
    void request();
}

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

typescript 复制代码
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("-----RealSubject 开始执行业务操作-----");
    }
}

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

csharp 复制代码
public class Proxy implements Subject {

    // 被代理的对象
    private Subject subject;

    public Proxy(Subject subject) {
        this.subject = subject;
    }

    @Override
    public 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

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

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

css 复制代码
-----Proxy before processor-----
-----RealSubject 开始执行业务操作-----
-----Proxy after processor-----

Process finished with exit code 0

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

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

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

相关推荐
qq_12498707533 分钟前
基于springboot框架的小型饮料销售管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·spring·毕业设计
LYFlied9 分钟前
【算法解题模板】-【回溯】----“试错式”问题解决利器
前端·数据结构·算法·leetcode·面试·职场和发展
我命由我1234510 分钟前
Python Flask 开发:在 Flask 中返回字符串时,浏览器将其作为 HTML 解析
服务器·开发语言·后端·python·flask·html·学习方法
程序员小寒10 分钟前
前端高频面试题:深拷贝和浅拷贝的区别?
前端·javascript·面试
拾忆,想起12 分钟前
设计模式:软件开发的可复用武功秘籍
开发语言·python·算法·微服务·设计模式·性能优化·服务发现
IT_陈寒19 分钟前
JavaScript 性能优化:5个被低估的V8引擎技巧让你的代码提速50%
前端·人工智能·后端
Code Slacker28 分钟前
LeetCode Hot100 —— 普通数组(面试纯背版)(五)
数据结构·c++·算法·leetcode·面试
想用offer打牌30 分钟前
数据库大事务有什么危害(面试版)
数据库·后端·架构
踏浪无痕38 分钟前
别再只会用 Feign!手写一个 Mini RPC 框架搞懂 Spring Cloud 底层原理
后端·面试·架构
用户695619440371 小时前
前后端分离VUE3+Springboot项目集成PageOffice核心代码
后端