python 动态代理模式_设计模式之动态代理模式(示例代码)

学习动态代理模式是为了以后学习AOP(面向切面编程)打下基础,他比装饰者模式还要灵活。

我们只学习他的一个方法:

Proxy.newProxyInstance(ClassLoader classLoader, Class[] interfaces, InvocationHandler invocationHandler);

作用:在运行时,动态创建一组指定的接口的实现类对象。

三个参数分别是:

1. ClassLoader classLoader:类加载器

2.Class[] interfaces:指定要实现的接口

3.InvocationHandler invocationHandler:调用处理器,这是个接口

查看API得知有一个方法:

public Object invoke(Object proxy, Method method, Object[] args);

interfaceA {voida();

Object aa(String x);

}interfaceB {voidb();

}public classDemo1 {public static voidmain(String[] args) {donttai();

}private static voiddonttai() {//通过目标对象得到类加载器     Demo1 d=new Demo1();

ClassLoader classLoader = d.getClass().getClassLoader();

InvocationHandler invocationHandler= newInvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throwsThrowable {

System.out.println("动态代理有点难");return "aaa";

}

};//使用三大参数创建代理对象

Object o =Proxy.newProxyInstance(classLoader,new Class[]{A.class, B.class}, invocationHandler);

A a=(A) o;

B b=(B) o;

a.a();

b.b();

输出:动态代理有点难

动态代理有点难

a被传递给了proxy这个参数,aa传递给了method参数,括号中的内容传递给了args1

Object aaa= a.aa("hello");

System.out.println(aaa);

输出:动态代理有点难

由此可得:代理对象实现的所有接口中的方法,内容都是调用InvocationHandler的invoke()方法

例子

public interfaceWaiter {//这个waiter可以服务别人

voidservice();

}public class ManWaiter implementsWaiter {public voidservice() {

System.out.println("服务周到");

}

}public classDemo1 {public static voidmain(String[] args) {

getOne();

}private static voidgetOne() {//manWaiter就是一个目标对象(需要被增强的)

Waiter manWaiter = newManWaiter();//通过目标对象得到类加载器

ClassLoader classLoader =manWaiter.getClass().getClassLoader();

//需要被实现的接口

Class[] interfaces= new Class[]{Waiter.class};

InvocationHandler invocationHandler= newInvocationHandler() {

@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throwsThrowable {

System.out.println("你好");

manWaiter.service();

System.out.println("再见");return null;

}

};//得到一个代理对象,代理对象就是在目标对象的基础上进行增强的对象

Waiter waiterProxy =(Waiter) Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);//在调用代理对象的时候,在前面添加“你好”,后面添加“再见”,//因为需要一个目标对象,所以需要自己传一个

waiterProxy.service();

}

}

输出:

你好

服务周到

再见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值