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

〇、前言

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

从《离婚律师》中学习代理模式_第1张图片

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

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

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

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

一、模式定义

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

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

代理模式所解决的问题:

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

二、类图

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

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

从《离婚律师》中学习代理模式_第2张图片

6.3> 类的实现

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

public interface Subject {
    void request();
}

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

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

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

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

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

你可能感兴趣的:(设计模式,面试题详解,代理模式,设计模式,java,面试)