代理模式

作者: milovetingting | 来源:发表于2020-02-17 21:45 被阅读0次

    个人博客

    http://www.milovetingting.cn

    代理模式

    模式介绍

    代理模式也称为委托模式,是一种结构型模式。

    模式定义

    为其他对象提供一种代理以控制对这个对象的访问。

    使用场景

    当无法或不想直接访问某个对象或访问对象存在困难时,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。

    简单使用

    定义接口

    public interface IVisitor {
    
        void visit();
    
    }
    

    定义实现类

    public class RealVisitor implements IVisitor {
    
        @Override
        public void visit() {
            System.out.println("Real visit");
        }
    
    }
    

    定义代理类

    public class ProxyVisitor implements IVisitor {
    
        private IVisitor mVisit;
    
        public ProxyVisitor(IVisitor mVisit) {
            super();
            this.mVisit = mVisit;
        }
    
        @Override
        public void visit() {
            mVisit.visit();
        }
    
    }
    

    调用

    public class Main {
    
        public static void main(String[] args) {
            IVisitor visitor = new RealVisitor();
            ProxyVisitor proxy = new ProxyVisitor(visit);
            proxy.visit();
        }
    
    }
    

    输出结果

    Real Visit
    

    代理模式可以大致分为两大部分,一是静态代理,二是动态代理。静态代理如上述示例那样,代理者的代码由程序员自己或通过一些自动化工具生成固定的代码,再对其进行编译,我们的代码在运行前代理类的class编译文件已经存在;动态代理则与静态代理相反,通过反射机制动态地生成代理者的对象,也就是说我们在code阶段根本不需要知道代理谁,代理谁我们将在执行阶段决定。Java给我们提供了一个便捷的动态代理接口InvocationHandler。

    定义动态代理类

    public class DynamicProxy implements InvocationHandler {
    
        private Object obj;
    
        public DynamicProxy(Object obj) {
            super();
            this.obj = obj;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = method.invoke(obj, args);
            return result;
        }
    
    }
    

    调用

    public class Main {
    
        public static void main(String[] args) {
            IVisitor visitor = new RealVisitor();
            DynamicProxy proxy = new DynamicProxy(visitor);
            ClassLoader loader = visitor.getClass().getClassLoader();
            IVisitor proxyVisitor = (IVisitor) Proxy.newProxyInstance(loader, new Class[] { IVisitor.class }, proxy);
            proxyVisitor.visit();
        }
    
    }
    

    相关文章

      网友评论

        本文标题:代理模式

        本文链接:https://www.haomeiwen.com/subject/ubnifhtx.html