java代理设计模式之静态代理,动态代理(适合新人)

1,什么是代理模式!

代理模式就是控制一个对象的访问,可以详细访问某个对象的方法调用处理,或则调用后处理。

2, 代理模式的应用场景

安全代理 可以屏蔽真实角色;
远程代理 远程调用代理类RMI;
延迟加载 先加载轻量级代理类,真正需要再加载真实;

3,代理的分类

  1. 静态代理(静态定义代理类)
  2. 动态代理(动态定义代理类)
    jdk自带动态代理
    Cgilb,javaassist(字节码操作库)

4, 静态代理

静态代理需要自己去实现代理类;******

  1. 先创建买房的操作
package daili;

public interface hose {
	//买房的操作
	public void mar();

}
  1. 实现买房子
package daili;

public class Xiaoming implements hose{
//买房子的人实现买房的想法
	@Override
	public void mar() {
		System.out.println("我要买房子了!");
		
	}

}

3.创建代理类

package daili;

public class Proxy implements hose{
	private Xiaoming xiaoming;

	public Proxy(Xiaoming xiaoming){
		this.xiaoming = xiaoming;
	}
	@Override
	public void invoke() {
		// TODO Auto-generated method stub
		System.out.println("我是中介,我买房的操作,我开始监听了!");
		xiaoming.mar();
		System.out.println("我是中介,我买房的操作,我结束监听了!");
	}
	
	//测试
	public static void main(String[] args) {
		Proxy proxy = new Proxy(new Xiaoming());
		proxy.invoke();
	}

}

5, 动态代理(jdk)

前两步同上,一抹一样!
然后开始创建代理,并且测试

package daili;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


/**
 * 
* 项目名称:shejimoshi  
* 类描述:("jdk实现动态代理")
* 创建人:莫参商 
* 创建时间:2020-1-11 下午2:52:38  
* 修改人:acer     
* @version   
*   
 */
public class jdkProxy implements InvocationHandler{

	private Object tarjet;

	public jdkProxy(Object tarjet){
		this.tarjet = tarjet;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("我是中介,我买房的操作,我开始监听了!");
		Object invoke = method.invoke(tarjet, args);
		System.out.println("我是中介,我买房的操作,我结束监听了!");
		return null;
	}
	public static void main(String[] args) {
		Xiaoming xiaoming = new Xiaoming();
		jdkProxy jdkp = new jdkProxy(xiaoming);
		hose p = (hose) Proxy.newProxyInstance(xiaoming.getClass().getClassLoader() , xiaoming.getClass().getInterfaces(), jdkp);
	    p.mar();
	}

}

总结

静态代理与动态代理的区别;
看过这两段代码,很多人心里都清楚了,静态代理你需要自己写出来代理类,这就是两种代理中的invoke方法,静态代理是每一个接口都需要手写这样的一个代理类,非常麻烦,
而动态代理只需要写一个代理类就ok了。
jdk自带的动态代理是用反射机制实现的。

发布了7 篇原创文章 · 获赞 7 · 访问量 208

猜你喜欢

转载自blog.csdn.net/qq_41566219/article/details/103936462