• 学习设计模式之静态代理


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

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

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

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

    勿在浮沙筑高台 ——个人浅见,难免有误导之处,麻烦请指出。
  • 相关阅读:
    1、Jenkins的安装与简单配置
    2、jenkins+svn自动发布和回滚
    关于kafka生产者相关监控指标的理解(未解决)
    Zabbix中获取各用户告警媒介分钟级统计
    2-4、配置Filebeat使用logstash
    JS基础 浏览器弹出的三种提示框(提示信息框、确认框、输入文本框)
    C# winform 托盘控件的使用
    c# 将两个表的有效数据合到一个表中
    C# 认识 接口
    let 和 var 定义变量的区别
  • 原文地址:https://www.cnblogs.com/liufeichn/p/11961652.html
Copyright © 2020-2023  润新知