Java记录 -90- 静态代理模式深度剖析

本文介绍了代理模式的基本概念,包括其作用、涉及的角色以及静态代理模式的实现方式。通过具体代码示例,展示了如何通过代理模式在不修改原有对象的基础上增加额外的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代理模式

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理地下可以在客户端和目标对象之间起到中介的作用。

代理模式一般涉及到三个角色:

1.抽象角色:声明真实对象和代理对象的共同接口;

2.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他操作,相当于对真实对象进行封装;

3.真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

静态代理模式的代码实现:

public abstract class Subject {    public abstract void request();}public class RealSubject extends Subject{    @Override    public void request() {        System.out.println("from real subject");    }}public class ProxySubject extends Subject{    private RealSubject realSubject; //代理角色内部引用了真实角色        @Override    public void request() {        preRequest(); //在真实角色操作之前所附加的操作                if(null == realSubject){            realSubject  = new RealSubject();        }        realSubject.request(); //真实角色完成的事情                postRequest(); //在真实角色操作之后所附加的操作    }    private void preRequest(){        System.out.println("pre request");    }    private void postRequest(){        System.out.println("post request");    }}public class Client {    public static void main(String[] args){        Subject subject = new ProxySubject();        subject.request();    }}

由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理RealSubject类,同样达到了目的,同时还封装了其他方法(preRequest(), postRequest()),可以处理一些其他问题。

如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值