zoukankan      html  css  js  c++  java
  • Spring中常用的设计模式之:代理模式

    看了tom老师讲的深入分析spring源码,讲的挺好,做个小总结

    代理模式的定义:

    为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    比如:

    租房中介、火车票黄牛、媒人、经纪人、快递   

    这些人和你之间的关系可以算作为代理模式,在我需要租房、买票、拿快递时我可以找一个这个中间人去替我办这件事

    代理模式需要满足的特点:

    1、执行者、被代理人

    2、对于被代理人来说,这件事情是一定要做的,但是我自己又不想做或者没有时间做,找代理。

    3、需要获取到被代理的人个人资料。

    代理模式和装饰模式区别:

    代理模式关心的不是结果 是过程;装饰模式关心的是最终结果

    下面是一个小demo,创建了一个媒婆代理帮你找对象功能:

    文件结构

    Person类:

    package spring;
    public interface Person {
    	void findLove();
    }

    Zhansan类:

    package spring;
    
    public class Zhansan implements Person{
    	private String sex = "女";
    	private String name = "Zhansan";
    	@Override
    	public void findLove() {
    		System.out.println("我叫:"+this.name+" 性别:"+this.sex);
    		System.out.println("我要找高富帅");
    	}
    }
    

    Meipo类:

    package spring;
    
    import java.lang.annotation.Target;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class Meipo implements InvocationHandler{
    	
    	private Person target;
    	
    	//获取被代理人的个人资料
    	public Object getInstance(Person target) {
    		this.target = target;
    		Class clazz = target.getClass();
    		//生成代理对象:3个参数:ClassLoader类加载器   实现接口,代理人
    		System.out.println("被代理对象是:"+clazz);
    		return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    	}
    	
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		System.out.println("我是媒婆,准备介绍");
    		System.out.println("------------");
    		this.target.findLove();
    		System.out.println("------------");
    		return null;
    	}
    	
    
    }
    

    测试类:

    package spring;
    
    public class TestFindLove {
    
    	public static void main(String[] args) {
    		Person obj = (Person) new Meipo().getInstance(new Zhansan());
    		System.out.println(obj.getClass());
    		obj.findLove();
    		/*原理:
    		 * 1 拿到带代理对象的引用,然后获取它的接口
    		 * 2 jdk代理重新生成一个类,同时实现我们给的代理对象所实现的接口
    		 * 3 把被代理对象的引用也拿到了
    		 * 4 重新动态生成一个class字节码
    		 * 5 编译
    		 */
    	}
    }
    

    输出结果:

    可以看到,测试类中虽然new的是一个zhangsan类 但是obj.getClass()的输出是代理类com.sun.proxy.$Proxy0

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/zhi-ming/p/10453127.html
Copyright © 2011-2022 走看看