博客
关于我
设计模式_结构型模式 -《代理模式》
阅读量:796 次
发布时间:2023-03-25

本文共 3291 字,大约阅读时间需要 10 分钟。

代理模式(Proxy Pattern)解析

代理模式概述

代理模式是一种常见的软件设计模式,主要用于在某些情况下直接访问目标对象不现实或不合适时,为目标对象提供一个代理对象。这个代理对象可以控制对目标对象的访问,或者在必要时进行一些额外的操作。

代理模式结构

代理模式主要包含三个角色:

  • 抽象主题(Subject):通过接口或抽象类声明真实主题和代理对象实现的业务方法。
  • 真实主题(Real Subject):实现了抽象主题中的具体业务,是代理对象所代表的真实对象。
  • 代理(Proxy):提供与真实主题相同的接口,其内部含有对真实主题的引用,可以访问、控制或扩展真实主题的功能。
  • 静态代理示例

    静态代理是指在编译阶段就生成代理类,常见于像小程序前端逻辑这样不需要频繁修改的地方。

    示例:火车票代售点

    • 目标对象:火车站,实现了卖票接口。
    • 代理对象:代售点,作为中介对卖票操作进行增强。
    // 抽象主题接口public interface SellTickets {    void sell();}// 真实主题类:火车站public class TrainStation implements SellTickets {    public void sell() {        System.out.println("火车站卖票");    }}// 代理类:代售点public class ProxyPoint implements SellTickets {    private TrainStation station = new TrainStation();    public void sell() {        System.out.println("代售点收取服务费用");        station.sell();    }}// 测试类public class Client {    public static void main(String[] args) {        ProxyPoint pp = new ProxyPoint();        pp.sell();    }}

    输出结果

    代售点收取服务费用火车站卖票

    JDK动态代理

    JDK动态代理由Java提供,适用于接口型的代理。其工作原理是通过反射机制动态生成代理类。

    代码示例

    // 抽象主题接口public interface SellTickets {    void sell();}// 真实主题类:火车站public class TrainStation implements SellTickets {    public void sell() {        System.out.println("火车站卖票");    }}// 代理工厂类public class ProxyFactory {    private TrainStation station = new TrainStation();    public SellTickets getProxyObject() {        return (SellTickets) Proxy.newProxyInstance(            station.getClass().getClassLoader(),            station.getClass().getInterfaces(),            new InvocationHandler() {                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                    System.out.println("JDK动态代理收取服务费用");                    return method.invoke(station, args);                }            }        );    }}// 测试类public class Client {    public static void main(String[] args) {        ProxyFactory factory = new ProxyFactory();        SellTickets proxyObject = factory.getProxyObject();        proxyObject.sell();    }}

    输出结果

    JDK动态代理收取服务费用火车站卖票

    CGLIB动态代理

    CGLIB动态代理适用于没有接口的情况,通过生成目标类的子类来实现代理。

    代码示例

    // 真实主题类:火车站public class TrainStation {    public void sell() {        System.out.println("火车站卖票");    }}// 代理工厂类(实现MethodInterceptor接口)public class ProxyFactory implements MethodInterceptor {    private TrainStation target = new TrainStation();    public TrainStation getProxyObject() {        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(target.getClass());        enhancer.setCallback(this);        return (TrainStation) enhancer.create();    }    public TrainStation intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {        System.out.println("CGLIB动态代理收取服务费用");        return methodProxy.invokeSuper(o, args);    }}// 测试类public class Client {    public static void main(String[] args) {        ProxyFactory factory = new ProxyFactory();        TrainStation proxyObject = factory.getProxyObject();        proxyObject.sell();    }}

    输出结果

    CGLIB动态代理收取服务费用火车站卖票

    代理模式对比

  • JDK vs CGLIB

    • JDK适用于接口代理,CGLIB适用于类代理。
    • CGLIB效率高于JDK,特别是在方法调用频繁时。
  • 静态代理 vs 动态代理

    • 静态代理在编译时生成,动态代理在运行时生成。
    • 动态代理更灵活,支持对接口方法数量众多的场景。
  • 代理模式优缺点

    • 优点

      • 提供对目标对象的保护。
      • 支持功能的扩展和增强。
      • 降低了系统耦合度。
    • 缺点

      • 增加了系统复杂度。
      • 运行时增加了方法调用开销。

    使用场景

  • 远程通信:隐藏复杂的网络通信逻辑,提供简洁接口。
  • 防火墙代理:处理网络请求和响应。
  • 权限控制:管理对资源的访问权限。
  • 通过以上分析,可以看出代理模式在系统设计中具有广泛的应用场景,能够有效地降低系统耦合度并提高灵活性。

    转载地址:http://jzhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现字符串Z 函数或 Z 算法(附完整源码)
    查看>>
    Objective-C实现字符串加解密(附完整源码)
    查看>>
    Objective-C实现字符串复制功能(附完整源码)
    查看>>
    Objective-C实现字符串是否回文Palindrome算法 (附完整源码)
    查看>>
    Objective-C实现字符串查找子串(附完整源码)
    查看>>
    Objective-C实现完整的ComplexNumber复数类(附完整源码)
    查看>>
    Objective-C实现实现rabin karp算法(附完整源码)
    查看>>
    Objective-C实现对图像进行色调处理算法(附完整源码)
    查看>>
    Objective-C实现对称矩阵压缩存储(附完整源码)
    查看>>
    Objective-C实现寻找欧拉路径/回路(附完整源码)
    查看>>
    Objective-C实现导弹跟踪算法(附完整源码)
    查看>>
    Objective-C实现将 base64 字符串转换为字节数组算法(附完整源码)
    查看>>
    Objective-C实现将位转换为浮点数bitsToFloat算法(附完整源码)
    查看>>
    Objective-C实现将列表向右旋转 k 个位置算法(附完整源码)
    查看>>
    Objective-C实现将字符串中大写字母转换为小写字母(附完整源码)
    查看>>
    Objective-C实现将字符串从一个基转换为另一个基算法(附完整源码)
    查看>>
    Objective-C实现将字节数组转换为 base64 编码算法(附完整源码)
    查看>>
    Objective-C实现将彩色图像转换为负片算法(附完整源码)
    查看>>
    Objective-C实现将无符号整数n变成成d进制表示的字符串s(附完整源码)
    查看>>
    Objective-C实现将给定的 utf-8 字符串编码为 base-16算法(附完整源码)
    查看>>