zoukankan      html  css  js  c++  java
  • 代理模式

    个人博客

    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();
    	}
    
    }
    
  • 相关阅读:
    vue实现短信验证码登录
    使用vue3.0和element实现后台管理模板
    vue导出excel数据表格功能
    Vue2.0-token权限处理
    vue2.0实现购物车功能
    Vue图片懒加载之lazyload插件使用
    H5 canvas 绘图
    前端常见跨域请求 方法
    Html5 @media + css3 媒体查询
    Java面试之RabbitMQ
  • 原文地址:https://www.cnblogs.com/milovetingting/p/12323867.html
Copyright © 2011-2022 走看看