博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代理模式(Proxy)
阅读量:4048 次
发布时间:2019-05-25

本文共 3349 字,大约阅读时间需要 11 分钟。

代理模式是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用。

代理分静态代理和动态代理

 

一、静态代理

代码示例

 

接口

package com.jialinl;public interface InterfaceUserManage {	public void AddUser();	public void DelUser();	public void ModifyUser();}

目标类

package com.jialinl;public class UserManageImp implements InterfaceUserManage {	@Override	public void AddUser() {		System.out.println("UserManageImp>>>>>AddUser");	}	@Override	public void DelUser() {		System.out.println("UserManageImp>>>>>DelUser");	}	@Override	public void ModifyUser() {		System.out.println("UserManageImp>>>>>ModifyUser");	}}

代理类

package com.jialinl;public class UserManageImpProxy implements InterfaceUserManage {	private InterfaceUserManage userManage;		public UserManageImpProxy(InterfaceUserManage userManage) {		this.userManage = userManage;	}		@Override	public void AddUser() {		try {			//记录日志等操作,完全可以使用代理来完成			System.out.println("start-->>addUser()");			userManage.AddUser();			System.out.println("success-->>addUser()");		}catch(Exception e) {			e.printStackTrace();			System.out.println("error-->>addUser()");		}		}	@Override	public void DelUser() {		//代理操作。。。。。		userManage.DelUser();	}	@Override	public void ModifyUser() {		//代理操作。。。。。		userManage.ModifyUser();	}}

客户端调用

package com.jialinl;public class Client {	public static void main(String[] args)	{		InterfaceUserManage userManager = new UserManageImpProxy(new UserManageImp());		userManager.AddUser();	}}

输出结果

start-->>addUser()

UserManageImp>>>>>AddUser
success-->>addUser()

从UML图和代码分析可以看出,静态代理会建立大量的类,一个接口基本对应一个代理类,而且(代理操作)重复的代码在每个方法中都有出现,我们应该杜绝这种重复。下面就要看我们的动态代理。

 

二、动态代理

JDK动态代理能对实现了接口的类进行代理,采用JDK动态代理必须实现InvocationHandler接口,采用Proxy类创建相应的代理类。

 

代码示例:

接口

package com.jialin;public interface InterfaceUserManage {	public void AddUser(String userName,String userAge);	public void DelUser();	public void ModifyUser();}

目标类

package com.jialin;public class UserManageImp implements InterfaceUserManage {	@Override	public void AddUser(String userName,String userAge) {		System.out.println("UserManageImp>>>>>AddUser("+userName+","+userAge+")");	}	@Override	public void DelUser() {		System.out.println("UserManageImp>>>>>DelUser");	}	@Override	public void ModifyUser() {		System.out.println("UserManageImp>>>>>ModifyUser");	}}

代理

package com.jialin;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class PublicProxy implements InvocationHandler {	private Object targetObject;		public Object newProxyInstance(Object targetObject) {		this.targetObject = targetObject;		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),							   targetObject.getClass().getInterfaces(), this);	}		public Object invoke(Object proxy, Method method, Object[] args)			throws Throwable {		System.out.println("开始调用目标方法-->>" + method.getName());		for (int i=0; i
>" + method.getName()+"--成功"); }catch(Exception e) { e.printStackTrace(); System.out.println("调用-->>" + method.getName()+"--失败"); throw e; } return null; }}

客户端

package com.jialin;public class Client {	public static void main(String[] args)	{		PublicProxy publicProxy = new PublicProxy();		InterfaceUserManage userManager = (InterfaceUserManage)publicProxy.newProxyInstance(new UserManageImp());		userManager.AddUser("王五","17");	}}

输出结果:

开始调用目标方法-->>AddUser

王五
17
UserManageImp>>>>>AddUser(王五,17)
调用-->>AddUser--成功

 

 

转载地址:http://uedci.baihongyu.com/

你可能感兴趣的文章
计算机的发展史
查看>>
带WiringPi库的交叉编译如何处理一
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Spring事务的七种传播行为
查看>>
ES写入找不到主节点问题排查
查看>>
Java8 HashMap集合解析
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
Android计算器实现源码分析
查看>>
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
自定义 select 下拉框 多选插件
查看>>
js获取url链接携带的参数值
查看>>
gdb 调试core dump
查看>>
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
linux和windows内存布局验证
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>