码迷,mamicode.com
首页 > 其他好文 > 详细

代理模式

时间:2018-07-20 11:21:49      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:over   代理类   ace   tcl   []   load   voc   反射   obj   

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

  ①静态代理

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

     

代理模式

标签:over   代理类   ace   tcl   []   load   voc   反射   obj   

原文地址:https://www.cnblogs.com/bockpecehhe/p/9335692.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!