设计模式-结构型模式之代理设计模式
文章目录
- 八、代理设计模式
八、代理设计模式
代理设计模式通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现) 。
代理有分静态代理和动态代理:
- 静态代理:在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
- 动态代理:是在使用时,动态的生成代理对象,他是在内存中构建代理对象的。
举个例子,在做数据库操作时,一般我们都会在事物中做SQL的操作,那就需要在操作前开启事物,操作后如果成功就需要提交事物,如果代用代理设计模式,就可以将事物开启提交逻辑放在代理类中,被代理的类,只需要关注业务逻辑即可。
下面以支付和事物为例演示下代理模式
采用静态代理,实现上面例子:
- 定义支付接口
public interface PayInterFace {
void pay();
}
- 定义微信支付实现
public class WxPay implements PayInterFace {
@Override
public void pay() {
System.out.println("支付中...");
}
}
- 定义支付的代理类
public class PayProxy implements PayInterFace {
private WxPay pay;
public PayProxy(WxPay pay) {
this.pay = pay;
}
@Override
public void pay() {
System.out.println("事物开始!");
pay.pay();
System.out.println("提交事物!");
}
}
- 演示
public class demo {
public static void main(String[] args) {
PayInterFace pay = new PayProxy(new WxPay());
pay.pay();
}
}
上面的静态代理,可以看出,我们需要对每个被代理对象设计一个代理类,如果代理的功能非常多,那就需要开发人员写特别多的代理类,下面可以看下动态代理的使用。
采用动态代理,实现上面例子:
这里使用JDK自带的动态代理来实现
- 再定义一个支付宝的支付实现
public class ZfbPay implements PayInterFace {
@Override
public void pay() {
System.out.println("支付宝支付中...");
}
}
- 定义代理对象,采用jdk的
InvocationHandler
接口
public class PayProxy implements InvocationHandler {
private Object object;
public PayProxy(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("事物开始!");
Object result = method.invoke(object, args);
System.out.println("提交事物!");
return result;
}
}
- 演示
public class demo {
public static void main(String[] args) {
PayInterFace pay = (PayInterFace) Proxy.newProxyInstance(
PayInterFace.class.getClassLoader(),
new Class[]{PayInterFace.class},
new PayProxy(new WxPay()));
pay.pay();
PayInterFace pay1 = (PayInterFace) Proxy.newProxyInstance(
PayInterFace.class.getClassLoader(),
new Class[]{PayInterFace.class},
new PayProxy(new ZfbPay()));
pay1.pay();
}
}
上面使用一个代理类,代理了多个对象,相对于静态代理,是代码更简介,灵活性也更高。