美文网首页
对静态代理的理解

对静态代理的理解

作者: pkxutao | 来源:发表于2019-03-06 17:55 被阅读0次

假如有一个使用账号密码登录功能,我们写这样一个类:

public class Login {

    public void print() {
        System.out.println("专注于账号密码登录中...");
    }
}

现在想在登录之前和之后分别想打点上报,但是打点上报却不属于登录的操作,我们不想把上报的代码写在登录模块中,于是我们可以这样写

public class LoginProxy {

    private Login login;

    public LoginProxy(Login login) {
        this.login = login;
    }

    public void print() {
        System.out.println("在登录之前上报...");
        login.print();
        System.out.println("在登录之后上报...");
    }
}

使用方法

    public static void main(String[] args) {
        Login login = new Login();
        LoginProxy loginProxy = new LoginProxy(login);
        loginProxy.print();
    }

这样在不丝毫影响登录模块的情况下实现登录前后的上报功能,这其实就是静态代理的实现,Login是被代理对象,LoginProxy是代理对象。
现在增加需求,要实现微信登录,于是增加一个登录类

public class WechatLogin {
    public void print() {
        System.out.println("专注于微信登录中...");
    }
}

代理类

public class WechatLoginProxy {
    private WechatLogin wechatLogin;

    public WechatLoginProxy(WechatLogin wechatLogin) {
        this.wechatLogin = wechatLogin;
    }

    public void print() {
        System.out.println("在登录之前上报...");
        wechatLogin.print();
        System.out.println("在登录之后上报...");
    }
}

这时候又增加需求,要实现QQ登录,于是新建QQLogin、QQLoginProxy......
在使用时太麻烦了,不符合设计原则,来改造一番。
新增接口:

public interface LoginInterface {
    public void print();
}

改造Login:

public class Login implements LoginInterface{

    @Override
    public void print() {
        System.out.println("专注于账号密码登录中...");
    }
}

改造WechatLogin:

public class WechatLogin implements LoginInterface{
    @Override
    public void print() {
        System.out.println("专注于微信登录中...");
    }
}

接着改造LoginProxy:

public class LoginProxy implements LoginInterface{

    private LoginInterface login;

    public LoginProxy(LoginInterface login) {
        this.login = login;
    }

    @Override
    public void print() {
        System.out.println("在登录之前上报...");
        login.print();
        System.out.println("在登录之后上报...");
    }
}

WechatLoginProxy:

public class WechatLoginProxy {
    private WechatLogin wechatLogin;

    public WechatLoginProxy(WechatLogin wechatLogin) {
        this.wechatLogin = wechatLogin;
    }

    public void print() {
        System.out.println("在登录之前上报...");
        wechatLogin.print();
        System.out.println("在登录之后上报...");
    }
}

使用时,想怎么登录直接传对应构造参数就行了

    public static void main(String[] args) {
        //账号密码登录
        LoginProxy loginProxy = new LoginProxy(new Login());
        loginProxy.print();
        //微信登录
        LoginProxy wechatProxy = new LoginProxy(new WechatLogin());
        wechatProxy.print();
    }

打印结果:

在登录之前上报...
专注于账号密码登录中...
在登录之后上报...
在登录之前上报...
专注于微信登录中...
在登录之后上报...

到此,一个标准的静态代理就出现了,之前查了一些静态代理资料,都有一句话:代理对象和被代理对象必须实现同一个接口。个人理解这样说的太绝对,其实不实现也可以实现静态代理的功能和运用原理,实现接口只是为了遵循面向接口编程的设计原则而已,和静态代理没有关系。

相关文章

  • 对静态代理的理解

    假如有一个使用账号密码登录功能,我们写这样一个类: 现在想在登录之前和之后分别想打点上报,但是打点上报却不属于登录...

  • 对动态代理的理解

    上一篇: 对静态代理的理解接上一篇,学习了静态代理后再来看看动态代理的机制。在上一篇博客中,我们使用静态代理实现了...

  • 静态代理和动态代理

    静态代理: 代码实现: 对原生对象进行增强。静态代理优点:1、易于理解和实现2、代理类和真实类的关系都是编译期决定...

  • 面试官让手写动态代理实现?——JDK代理和CGLIB代理解析

    一、什么是动态代理 动态代理是相对于静态代理产生的概念。 可以简单理解为,静态代理是在代码中编写好代理类,动态代理...

  • 代理模式

    概述 为其他对象提供一种代理,用以控制对这个对象对访问 分类 静态代理、动态代理 静态代理 AbstractObj...

  • 静态代理和动态代理

    一:概述 二:静态代理 理解静态代理的经典场景就是买火车票,火车票代售点和火车站之间的关系就是静态代理的关系。代售...

  • 代理模式的理解,以及由此引发对设计模式的理解

    在看狂神讲Spring AOP的时候,又顺便讲到了代理模式。 静态代理 静态代理模式还是比较好理解的。就是在客户和...

  • java动态代理作用及源码分析

    一、理解 静态代理:静态代理是在编译时就将接口、实现类、代理类一股脑儿全部手动完成 动态代理:在程序运行期间根据需...

  • Android代理模式基础讲解

    一、代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。 二、静态代理 静态代理的代理类持有被...

  • 带你初识Java的代理模式

    Spring AOP是基于动态代理设计模式实现的,相对的就有静态代理 动态代理和静态代理 静态代理 对于静态代理,...

网友评论

      本文标题:对静态代理的理解

      本文链接:https://www.haomeiwen.com/subject/twexpqtx.html