学习设计模式之静态代理

代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问。

应用场景
假设有一组对象都实现同一个接口,实现同样的方法,但这组对象中有一部分对象需要有单独的方法,传统的笨办法是在每一个应用端都加上这个单独的方法,但是代码重用性低,耦合性高。代理模式很好的解决了这个问题。

结构图
在这里插入图片描述
代码实现

/**
 * 定义了 RealSubject 和 Proxy 的公用接口,这样就可以在任何时候使用 RealSubject 的地方都可以使用 Proxy
 */
public interface Subject {
    void request();
}

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("真实的请求!");
    }
}
public class SubjectProxy implements Subject {

    private Subject subject;

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

    @Override
    public void request() {
        this.subject.request();
    }
}
public class SubjectClient {
    public static void main(String[] args) {
        Subject subject = new RealSubject();
        Subject proxy = new SubjectProxy(subject);
        proxy.request();
    }
}

我们使用代理模式解决了上述问题,从静态代理的使用上来看,我们一般是这么做的。
1,代理类一般要持有一个被代理的对象的引用。
2,对于我们不关心的方法,全部委托给被代理的对象处理。
3,自己处理我们关心的方法。

这种代理是死的,不会在运行时动态创建,因为我们相当于在编译期,也就是你按下CTRL+S的那一刻,就给被代理的对象生成了一个不可动态改变的代理类。

静态代理对于这种,被代理的对象很固定,我们只需要去代理一个类或者若干固定的类,数量不是太多的时候,可以使用,而且其实效果比动态代理更好。

缺点就是只能代理一个固定的类,如果想代理多个比如像给所有的Controller的方法前后打印入参最后打印结果。这样如果使用静态代理,就会新建很多很多的类使用动态代理会更好,动态代理会在下一章说。

勿在浮沙筑高台 ——个人浅见,难免有误导之处,麻烦请指出。
原文地址:https://www.cnblogs.com/liufeichn/p/11961652.html