Proxy代理设计模式

文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. Command命令设计模式
  2. Singleton单例设计模式
  3. Decorator装饰设计模式
  4. Template模板模式
  5. Strategy策略设计模式
  6. Proxy代理设计模式
  7. Factory工厂类设计模式
  8. 设计模式的6大基本原则

文章目录:

一.静态代理设计模式JAVA代码实现如下(静态代理不是静态方法调用,而是一种普通的调用方式):

二.动态代理设计模式JAVA代码实现如下:


代理设计模式

代理设计模式,在我看来和委托设计模式差不多,代理设计模式是指客户端并不直接调用实际对象,而是通过调用代理,来间接的调用实际的对象。

比如:你有官司,请一个律师给你打官司,就是你的律师给你代理打官司,代理设计模式就是类似于这种行为的抽象。


其中代理设计模式,分为静态代理设计模式和动态代理设计模式(JDK动态代理和Cglib)这两种在spring中都有体现:

一.静态代理设计模式JAVA代码实现如下(静态代理不是静态方法调用,而是一种普通的调用方式):

1.定义一个Student的接口


public interface Student {
	void study();
}

2.一个代理对象实现这个接口:

public class ProxyStudent implements Student{ 
	private Student student;
	public ProxyStudent(Student student){
		this.student=student;
	}
	public void study() {
		student.study();
	}
}

3.定义一个实例对象去实现这个接口:

//测试RealStudent设计模式
public class RealStudent implements Student{
    private String study="study";
	public void study() {
		System.out.println(study);
	}
}

4.写一个测试类去测试代理模式例子:

import org.junit.Test;
/**
*类描述:测试代理设计模式
*@author: 张宇
*@date: 日期: 2018年7月23日 时间: 下午9:08:32
 */
public class TestStudent {
	@Test
	public void fun(){
		ProxyStudent student=new ProxyStudent(new RealStudent());
		student.study();
	}
}

测试结果: study


二.动态代理设计模式JAVA代码实现如下:

1.写一个接口和静态代理一样:

package DynamicProxyPattern;
public interface Student {
	void study();
}

2.写一个实现接口的实体类:

package DynamicProxyPattern;
public class RealStudent implements Student{
    private String study="study";
	@Override
	public void study() {
		System.out.println(study);
	}
}

3.写一个动态代理的类,获取对象,利用反射机制:

package DynamicProxyPattern;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

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 student=method.invoke(object, args);
		return student;
	}
}

4.测试动态代理:

package DynamicProxyPattern;
import java.lang.reflect.Proxy;
import org.junit.Test;
/**
*类描述:测试动态代理,利用反射技术进行测试
*@author: 张宇
*@date: 日期: 2018年7月23日 时间: 下午9:34:00
 */
public class TestDynamicProxy {
	@Test
	public void fun(){
		//定义他的实例化对象
		Student realSubject=new RealStudent();
		//获取它的代理对象
		DynamicProxy proxy=new DynamicProxy(realSubject);
		//获取类的加载器对象
		ClassLoader classLoader=realSubject.getClass().getClassLoader();
		//通过反射获取类的对象
		Student student=(Student)Proxy.newProxyInstance(classLoader, new Class[]{Student.class}, proxy);
		//对象调用方法
		student.study();
	}
}

测试结果: study

           动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。这样,在接口方法数量比较多的时候,可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转,而且动态代理的应用使我们的类职责更加单一,复用性更强。

          Spring中默认是利用JDK的动态代理,前提是jdk的动态代理实现了一个接口,要实现InvocationHandler接口;如果没有接口的话,spring中利用的cglib动态代理,生成一个该类的子类,完成调用类中方法的作用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值