zoukankan      html  css  js  c++  java
  • 学习设计模式之静态代理

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

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

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

    /**
     * 定义了 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的方法前后打印入参最后打印结果。这样如果使用静态代理,就会新建很多很多的类使用动态代理会更好,动态代理会在下一章说。

    勿在浮沙筑高台 ——个人浅见,难免有误导之处,麻烦请指出。
  • 相关阅读:
    shell中的$()、${}、$(())、(())
    阿拉伯数字转中文大写数字的JS
    Oracle创建新用户并将某一用户的表导进来
    便当
    登陆weblogic后页面控制台卡主
    weblogic启动错误 Unrecognized option: -jrockit
    Linux静默安装weblogic
    在vim下按ctrl+s后界面卡住
    使用SQL语句从数据库一个表中随机获取数据
    查询json数据结构的8种方式
  • 原文地址:https://www.cnblogs.com/liufeichn/p/11961652.html
Copyright © 2011-2022 走看看