`
thecloud
  • 浏览: 882822 次
文章分类
社区版块
存档分类
最新评论

代理模式(Proxy)

 
阅读更多

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

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

一、静态代理

代码示例

接口

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<args.length; i++) {
			//打印调用目标方法的参数
			System.out.println(args[i]);
		}
		
		try {
			//调用目标方法
			method.invoke(targetObject, args);
			System.out.println("调用-->>" + 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--成功

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics