专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java设计模式-结合实际工作梳理代理模式

temp10 2024-10-24 17:22:52 java教程 11 ℃ 0 评论

可以与之前的一篇文章结合阅读Java代理模式学习

本文主要以梳理代理模式为主要目标。

Java设计模式-结合实际工作梳理代理模式

客户端通过代理对象间接访问目标对象,对客户端来说,目标对象是隐藏的,目的让代理模式起到对目标对象的保护作用。

首先要划分清楚代理模式的常用实现分类,分别是静态代理、动态代理、cglib。

然后什么情况下使用静态代理模式呢?

  1. 权限控制,比如目标对象有很多非常棒的功能,但是它想把这些功能划分权限,提供给不同的调用者使用,就可以新加一个代理对象,在代理对象中实现不同功能权限的调用
  2. 扩展功能,代理对象还可以在自身类中添加新的功能对目标对象进行功能的扩展
  3. 隐藏某个类,使用代理对象代替目标对象进行功能调用

静态代理

  1. 代理类和委托类实现同一接口
  2. 在委托类中实现功能,在代理类中的方法中引用委托类的方法
  3. 运行时,直接调用代理类的方法,间接调用委托类的功能方法

UML类图如下:

类与类之间的连接线,先说明一下:

虚线+空心三角:表示实现指向的接口类

实线+空心棱形:表示代理类聚合委托类,也就是代理类把委托类作为成员变量引用

动态代理

使用Java提供的InvocationHandler接口来实现

  1. 代理类实现Java提供的InvocationHandler接口,重写public Object invoke(Object obj, Method method, Object[] args)方法

invoke方法参数说明:

第一个参数Object:指的是代理类对象

第二个参数Method:指的是正在执行的委托类方法

第三个参数Object[]:指的是正在执行的委托类方法的多个参数数组

主要实现代码:

public class JdkProxy implements InvocationHandler {
		private 接口对象;
  	
  	public 接口对象 getInstance(接口对象) {
    		this.接口对象 = 接口对象;
      	Class<?> class = 接口对象.getClass();
      	return (接口对象)Proxy.newProxyInstance(class.getClassLoader(), class.getInterfaces(), this);
    }
  
  	@override
  	public Object invoke(Object obj, Method method, Object[] args) {
    		return method.invoke(this.接口对象, args);
    }
}

public static void main(String[] args) {
		JdkProxy jdkProxy = new JdkProxy();
  	接口对象 = jdkProxy.getInstance(new 目标对象);
  	//下一步,就可以通过代理对象jdkProxy.getInstance方法得到的接口对象调用目标对象的方法了
}

cglib篇幅很长,再下一篇文章中写[奸笑],敬请期待...

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表