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

〇、前言

在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^)/ ~ 「干货分享,每天更新」

相关推荐
灰子学技术26 分钟前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
Gogo8161 小时前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang1 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐2 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
野犬寒鸦4 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
逍遥德4 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
J_liaty5 小时前
23种设计模式一代理模式
设计模式·代理模式
MX_93595 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
小迷糊的学习记录5 小时前
0.1 + 0.2 不等于 0.3
前端·javascript·面试
程序员敲代码吗5 小时前
面试中sessionStorage问题引发深度探讨
面试·职场和发展