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

对静态代理的理解

作者: 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();
        }
    

    打印结果:

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

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

    相关文章

      网友评论

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

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