设计模式-结构型模式之代理设计模式

文章目录

八、代理设计模式

代理设计模式 通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现) 。

代理有分静态代理动态代理

  • 静态代理:在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
  • 动态代理:是在使用时,动态的生成代理对象,他是在内存中构建代理对象的。

举个例子,在做数据库操作时,一般我们都会在事物中做SQL的操作,那就需要在操作前开启事物,操作后如果成功就需要提交事物,如果代用代理设计模式,就可以将事物开启提交逻辑放在代理类中,被代理的类,只需要关注业务逻辑即可。

下面以支付和事物为例演示下代理模式

采用静态代理,实现上面例子:

  1. 定义支付接口
java 复制代码
public interface PayInterFace {
    void pay();
}
  1. 定义微信支付实现
java 复制代码
public class WxPay implements PayInterFace {
    @Override
    public void pay() {
        System.out.println("支付中...");
    }
}
  1. 定义支付的代理类
java 复制代码
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("提交事物!");
    }
}
  1. 演示
java 复制代码
public class demo {
    public static void main(String[] args) {
        PayInterFace pay = new PayProxy(new WxPay());
        pay.pay();
    }
}

上面的静态代理,可以看出,我们需要对每个被代理对象设计一个代理类,如果代理的功能非常多,那就需要开发人员写特别多的代理类,下面可以看下动态代理的使用。

采用动态代理 ,实现上面例子:

这里使用JDK自带的动态代理来实现

  1. 再定义一个支付宝的支付实现
java 复制代码
public class ZfbPay implements PayInterFace {
    @Override
    public void pay() {
        System.out.println("支付宝支付中...");
    }
}
  1. 定义代理对象,采用jdk的 InvocationHandler 接口
java 复制代码
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;
    }
}
  1. 演示
java 复制代码
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();

    }
}

上面使用一个代理类,代理了多个对象,相对于静态代理,是代码更简介,灵活性也更高。

相关推荐
DevOpenClub8 分钟前
职教高考及高职分类招生控制线 API 接口
java·数据库·高考
Tsuki_tl9 分钟前
【总结】Java的线程状态
java·后端·面试·多线程·并发编程·线程状态
苦逼的猿宝15 分钟前
springboot的网页时装购物系统
java·毕业设计·springboot·计算机毕业设计
WL_Aurora16 分钟前
Java多线程编程基础与实践
java·多线程
再写一行代码就下班20 分钟前
根据给定word模板,动态填充指定内容,并输出为新的word文档。(${aa}占位符方式且支持循环动态表格)
java·开发语言
西安邮电大学28 分钟前
SpringMVC执行流程
java·后端·spring·面试
i220818 Faiz Ul30 分钟前
智慧养老平台|基于SprinBoot+vue的智慧养老平台系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设·智慧养老平台
AI砖家30 分钟前
每日一个skill:web-artifacts-builder,构建复杂 Claude.ai HTML Artifact 的生产力工具包
java·前端·人工智能·python
彦为君37 分钟前
JavaSE-05-字符串(全面深入)
java·开发语言·python·ai·ai编程
叶半欲缺1 小时前
Linux初始化数据盘
java·linux·服务器