关于动态代理的设计模式

  • 关于动态代理:
  • 本质和装饰者模式差不多,本质上都是对接口实现的加强:
  • 我们需要一个普通的接口:
1
2
3
public interface Waiter {
public void serve();
}
  • 实现这个接口的方法:
1
2
3
4
5
public class MyWaiter implements Waiter {
public void serve() {
System.out.println("服务...");
}
}
  • 对接口的实现类的加强
  • 加强的方法主要是实现他的代理对象的接口的其中的一个接口InvocationHandler 动态处理器重写他的invoke 的方法,从而调用waiter的server方法之前都会先调用invoke的方法,从而对server 方法的加强。
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyInvocationHandler implements InvocationHandler {
public Waiter target;
public MyInvocationHandler(Waiter target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("您好!");
Object result = method.invoke(target, args);
System.out.println("很高兴为您服务!");
return result;
}
}
  • 在主方法中调用这个方法:
1
2
3
4
5
6
7
8
9
10
public class MainApp1 {
public static void main(String[] args) {
ClassLoader loader = MainApp1.class.getClassLoader();
Class[] cs = {Waiter.class};
Waiter target = new MyWaiter();
MyInvocationHandler h = new MyInvocationHandler(target);
Waiter waiter = (Waiter)Proxy.newProxyInstance(loader, cs, h);
waiter.serve();
}
}
  • 普通的代理的方法的实现:
  • 无论你实现接口中的任何一个方法都会调用invoke的方法
  • 我们要对proxy的newproxyInstace参数进行说明:
  • classloader 类加载器
  • class[] 一个类的数组
  • InvacationHander 动态处理器,实现这个接口的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
Class[] cs = {MyInterface.class};
ClassLoader loader = MyInterface.class.getClassLoader();
InvocationHandler h = new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("无论你调用代理对象的什么方法,其实都是在调用invoke()...");
return null;
}
};
MyInterface mi = (MyInterface)Proxy.newProxyInstance(loader, cs, h);
mi.fun1();
mi.fun2();
}
  • 想想一下:proxy会对你的接口塑造一个实现类的,而在实现类中的实现的方法里面会调用invoke的方法,所以invocationHander的invoke方法都会被调用
1
2
3
4
5
6
7
8
9
10
11
12
13
class X implements MyInterface {
private InvocationHandler h;
public X(InvocationHandler h) {
this.h = h;
}

public void fun1() {
h.invoke();
}
public void fun2() {
h.invoke();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值