标签:java设计模式 j2ee 实例 interface 程序开发
代理模式是常用的java设计模式,他的特征是代理类与目标类有同样的接口,代理类主要负责为目标类预处理消息、过滤消息、把消息转发给目标类,以及事后处理消息等。代理类与目标类之间通常会存在关联关系,一个代理类的对象与一个目标类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用目标类的对象的相关方法,来提供特定的服务。
结构图如下:
动态代理:在程序运行时,运用反射机制动态创建代理类(Proxy)而成。
package ZhuDan.Test;
public interface UserManager {
public void addUser(String UserId,String UserName);
public void queryUser(String UserId);
}UserManagerImpl目标类实现UserManager接口:package ZhuDan.Test;
public class UserManagerImpl implements UserManager {
public void addUser(String UserId,String UserName) {
System.out.println("用户ID:"+UserId);
System.out.println("用户名:"+UserName);
}
public void queryUser(String UserId){
System.out.println("用户ID:"+UserId);
}
}UserManagerImplProxy代理类实现UserManager接口:package ZhuDan.Test;
public class UserManagerImplProxy implements UserManager {
private UserManager userManager;
public UserManagerImplProxy(UserManager userManager){
this.userManager=userManager;
}
public void addUser(String UserId,String UserName) {
try{
System.out.println("~~~~~~~~~~addUser开始执行~~~~~~~~~~~");
userManager.addUser( UserId,UserName);
}catch(Exception e){
e.printStackTrace();
System.out.print("~~~~~~~~~~addUser执行出错~~~~~~~~~~~");
}finally{
System.out.print("~~~~~~~~~~addUser成功执行~~~~~~~~~~~");
}
}
public void queryUser(String UserId){
try{
System.out.println("~~~~~~~~~~queryUser开始执行~~~~~~~~~~~");
userManager.queryUser( UserId);
}catch(Exception e){
e.printStackTrace();
System.out.print("~~~~~~~~~~queryUser执行出错~~~~~~~~~~~");
}finally{
System.out.print("~~~~~~~~~~queryUser成功执行~~~~~~~~~~~");
}
}
}
package ZhuDan.Test;
public class Manager {
public static void main(String args[]){
UserManager userManager=new UserManagerImplProxy(new UserManagerImpl());
userManager.addUser("0001", "张三");
userManager.queryUser("0001");
}
}package ZhuDan.Test;
public interface UserManager {
public void FindUserById(String UserId);
public void addUser(String UserId,String UserName);
}UserManagerImpl目标类实现UserManager接口:package ZhuDan.Test;
public class UserManagerImpl implements UserManager {
public void addUser(String UserId,String UserName) {
System.out.println("用户ID:"+UserId);
System.out.println("用户名:"+UserName);
}
public void FindUserById(String UserId){
System.out.println("用户ID:"+UserId);
}
}UserManagerImplProxy代理类实现InvocationHandler接口:package ZhuDan.Test1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class UserManageProxy implements InvocationHandler {
private Object target;
/**
* 绑定委托对象并返回一个代理类
* @param target
* @return
*/
public Object bind(Object target) {
//目标
this.target = target;
ClassLoader str= target.getClass().getClassLoader();
//取得代理对象
//newProxyInstance三个参数:代理类的装载器、接口、指派方法调用的调用处理程序
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
//args:包装所有参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
System.out.println("~~~~~~~~~~"+method.getName()+" 开始执行~~~~~~~~~~~");
//取得参数
for(int i=0;i<args.length;i++){
System.out.println("《~~~~~~~~~~参数为:"+args[i]+"~~~~~~~~~~~》");
}
try{
//执行方法 ,添加方法就是target,args是参数
result=method.invoke(target, args);
System.out.println("~~~~~~~~~~"+method.getName()+" 成功执行~~~~~~~~~~~");
}catch(Exception e){
e.printStackTrace();
System.out.print("~~~~~~~~~~"+method.getName()+"执行出错~~~~~~~~~~~");
}
return result;
}
}Manager类:package ZhuDan.Test1;
public class Manager {
public static void main(String args[]){
UserManageProxy userManagerProxy=new UserManageProxy();
UserManager userManager=(UserManager)userManagerProxy.bind(new UserManagerImpl());
userManager.FindUserById("0001");
userManager.addUser("0001", "张三");
}
}输出结果:代理模式(静态代理+动态代理)——JAVA,布布扣,bubuko.com
标签:java设计模式 j2ee 实例 interface 程序开发
原文地址:http://blog.csdn.net/dandanzmc/article/details/38387213