代理模式

Posted bockpecehhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。

代理模式包括静态代理和动态代理 

  ①静态代理

public interface Subject {
    void visit();
}

真实访问类

public class RealSubject implements Subject {
    private String name="mark";
    @Override
    public void visit() {
        System.out.println(name);
    }
}

静态代理类 

缺点:每一个代理类都必须实现一遍委托类(也就是realsubject)的接口,如果接口增加方法,则代理类也必须跟着修改。其次,代理类每一个接口对象对应一个委托对象,如果委托对象非常多,则静态

代理类就非常臃肿,难以胜任

public class ProxySubject implements Subject {
    private Subject subject;
    @Override
    public void visit() {
        subject.visit();
    }
    public ProxySubject(Subject subject){
        this.subject=subject;
    }

    public static void main(String[] args) {
        ProxySubject proxySubject = new ProxySubject(new RealSubject());
        proxySubject.visit();
    }
}

②动态代理

什么是动态代理?

动态代理有别于静态代理,是根据代理的对象,动态创建代理类。这样,就可以避免静态代理中代理类接口过多的问题。动态代理是实现方式,是通过反射来实现的,借助Java自带的java.lang.reflect.Proxy,通过固定的规则生成。
其步骤如下:    

编写一个委托类的接口,即静态代理的(Subject接口)
实现一个真正的委托类,即静态代理的(RealSubject类)
创建一个动态代理类,实现InvocationHandler接口,并重写该invoke方法
在测试类中,生成动态代理的对象。
  • import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class DynamicProxy implements InvocationHandler {
    
        private Object object;
    
        public DynamicProxy(Object object){
            this.object=object;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object invoke = method.invoke(object, args);
            return invoke;
        }
    
        public static void main(String[] args) {
            RealSubject realSubject = new RealSubject();
            DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
            ClassLoader classLoader = realSubject.getClass().getClassLoader();
            Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new  Class[]{Subject.class}, dynamicProxy);
            subject.visit();
        }
    }

     


以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

用于从 cloudkit 检索单列的代码模式/片段

java代码实现设计模式之代理模式

代理模式(静态代理动态代理)代码实战(详细)

Java设计模式-代理模式之动态代理(附源代码分析)

代理模式(静态代理)