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

    勿在浮沙筑高台 ——个人浅见,难免有误导之处,麻烦请指出。
  • 相关阅读:
    LiveData讲解
    Android分区存储相关
    十:存储过程和函数
    九:事务
    八:约束 和分页
    七:常见的数据类型
    六:创建和管理表
    五:SQL常见的函数
    四:SQL基本语句
    二:MYSQL 数据库的安装和常见一些命名
  • 原文地址:https://www.cnblogs.com/liufeichn/p/11961652.html
Copyright © 2011-2022 走看看