您的位置:首页 > 其它

了解代理模式

2017-09-24 11:37 344 查看
1.建立一个接口类和实现类
package cn.mldn.dao;

import cn.mldn.vo.User;

import java.util.List;

/**
* Created by wq on 2017/9/18.
*/
public interface IUserDAO {
public void doCreate(User vo) throws Exception;
public void doUpdate(User vo) throws Exception;
public void doRemove(String  name) throws Exception;
public User findByName(String name) throws Exception;
public List<User> findAll() throws  Exception;

}
package cn.mldn.dao.impl;

import cn.mldn.dao.IUserDAO;
import cn.mldn.vo.User;

import java.util.List;

/**
* Created by wq on 2017/9/18.
*/
public class UserDAOImpl implements IUserDAO {
@Override
public void doCreate(User vo) throws Exception {
System.out.println("【增加数据:doCreate】"+vo);
}

@Override
public void doUpdate(User vo) throws Exception {
System.out.println("【修改数据:doUpdate】"+vo);
}

@Override
public void doRemove(String name) throws Exception {
System.out.println("【删除数据:doRemove】"+name);
}

@Override
public User findByName(String name) throws Exception {
System.out.println("【查询数据:findByName】"+name);

return null;
}

@Override
public List<User> findAll() throws Exception {
System.out.println("【查询数据:findAll】");
return null;
}
}
2.建立代理类
package cn.mldn.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* Created by wq on 2017/9/23.
*/
public class DAOProxy implements InvocationHandler{
private Object target; //要代理的对象信息
//需要由系统生产一个指定接口的代理类对象
public Object bind(Object target){
this.target=target;
//返回与当前传入对象结构相同的代理对象

return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//取得当前执行的方法的名称
this.log(method.getName());

Object retObj = method.invoke(this.target,args);

//如果是更新则进行事物处理
if (method.getName().matches("do[a-zA-Z0-9]+")){
this.commit();
}

return retObj;
}
public  void log(String methodName){
System.out.println("进行日志记录 ,方法:"+methodName);
}

public  void commit(){
System.out.println("事务提交。");
}

}
3.建立代理测试类
package cn.mldn.test;

import cn.mldn.dao.IUserDAO;
import cn.mldn.dao.impl.UserDAOImpl;
import cn.mldn.dao.proxy.UserDAOProxy;

/**
* Created by wq on 2017/9/17.
*/

public class ProxyDemo {
public static  void main(String[] args ) throws Exception {
IUserDAO dao=(IUserDAO) new UserDAOProxy().bind(new UserDAOImpl());
dao.doCreate(null);
dao.findByName("hello");
}

}
传入的是接口,如果没有接口则会出现错误 所以用cglib包进行设计
以下是:
代理测试类
package cn.mldn.test;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** Created by wq on 2017/9/24.*/class  Hello{public void print(){System.out.println("中午了,肚子饿了吧?听晕了不");}}public class CGLIBProxyDemo {public static  void main(String[] args ) throws Exception {final Hello hello = new Hello();//代理类对象Enhancer enhancer = new Enhancer();//为代理类设置一个父类enhancer.setSuperclass(Hello.class);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("******************");return method.invoke(hello,objects);}});//返回代理类对象Hello temp= (Hello) enhancer.create();temp.print();}}
成功:
本案例导入的包为cglib-2.1.3.jar
和asm.jar   已经上传自行下载

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  代理模式