Java设计模式-代理模式

Java设计模式-代理模式

2016/6/18 18:55:22 seventeenWen

其实学代理模式主要是为了理解Spring的AOP思想,

动态代理模式

动态代理主要涉及Proxy和InvocationHandler两个类,可以通过实现该接口的invoke方法,将横切逻辑和业务逻辑编织在一起,

newProxyInstance()的三个参数

方法作用:动态生成一个对象,这个对象实现类多个接口

Object proxy = Proxy.newProxyInstance(ClassLoader classLoader,Class[] interfaces,InvocationHandler handler);

  1. ClassLoader:类加载器

  2. interfaces:需要实现的接口

  3. handler:调用处理器

简单的Demo

Demo的设定:现在要做的事情是我在每一次数据库的操作前后添加日志信息

先来简单定义一个接口:

A接口:

public interface AService {



public void addA();



public void deleteA();

} 

A的实现类:

public class AServiceImp implements AService{



public void addA() {

    System.out.println("向A中添加一条数据");

}



public void deleteA() {

    System.out.println("向A中删除一条数据");

}



}

日志记录类:

public class Log {



public void beforeLog(){

    System.out.println("操作前-----记录日志");

}

public void afterLog(){

    System.out.println("操作后-----记录日志");

}

}

Handler类(动态代理的关键类):

public class ProxyService implements InvocationHandler{



private Object target;

private Log log;

public ProxyService(Object target){

    this.target=target;

}





public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    log =new Log();

    log.beforeLog();

    Object result =method.invoke(target, args);

    log.afterLog();

    return result;

}







}

测试类:

public class RunTest {





@Test

public void Demo(){

    AService a =new AServiceImp();



    ProxyService handler =new ProxyService(a);

    ClassLoader loader = this.getClass().getClassLoader();

    Class[] interfaces ={AService.class};



    AService proxy =(AService) Proxy.newProxyInstance(loader, interfaces, handler);



    proxy.addA();

    proxy.deleteA();



}



}

运行结果:

操作前-----记录日志

向A中添加一条数据

操作后-----记录日志

操作前-----记录日志

向A中删除一条数据

操作后-----记录日志
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值