前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之代理模式

设计模式之代理模式

作者头像
九转成圣
发布2024-04-10 17:03:30
660
发布2024-04-10 17:03:30
举报
文章被收录于专栏:csdncsdn

代理模式(Proxy)

定义

为其他对象提供一种代理以控制对这个对象的访问

使用场景

  1. 远程代理 :为位于两个不同地址空间对象的访问提供了一种实现机制,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率。
  2. 虚拟代理:通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销。
  3. 缓冲代理:为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间。
  4. 保护代理:可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限。
  5. 智能引用:要为一个对象的访问(引用)提供一些额外的操作时可以使用

静态代理

静态代理是指代理与被代理者的关系在编译期间就确定了

主要角色

  1. 抽象主题(Subject)
  2. 真实主题(RealSubject)
  3. 代理(Proxy)

类图

示例代码

代码语言:javascript
复制
public interface Subject {
    void request();
}
代码语言:javascript
复制
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: handling request.");
    }
}
代码语言:javascript
复制
public class Proxy implements Subject {
    private final RealSubject realSubject = new RealSubject();

    @Override
    public void request() {
        preRequest();
        realSubject.request();
        postRequest();
    }

    private void preRequest() {
        System.out.println("Proxy: before request.");
    }

    private void postRequest() {
        System.out.println("Proxy: after request.");
    }
}
代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }
}

动态代理

JDK动态代理

代码语言:javascript
复制
public static void main(String[] args) {
    RealSubject target = new RealSubject();
    InvocationHandler invocationHandler = (proxy1, method, args1) -> {
        System.out.println("before...");
        Object result = method.invoke(target, args1);
        System.out.println("after...");
        return result;
    };
    Subject subjectProxy = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(),
                                                            RealSubject.class.getInterfaces(), invocationHandler);
    subjectProxy.request();
}

Cglib动态代理

代码语言:javascript
复制
public static void main(String[] args) {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(RealSubject.class);
    MethodInterceptor methodInterceptor = (target, method, objects, methodProxy) -> {
        System.out.println("方法前");
        Object result = methodProxy.invokeSuper(target, objects);
        System.out.println("方法后");
        return result;
    };
    enhancer.setCallback(methodInterceptor);
    Subject proxy = (Subject) enhancer.create();
    proxy.request();
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代理模式(Proxy)
  • 定义
  • 使用场景
  • 静态代理
    • 主要角色
      • 类图
        • 示例代码
        • 动态代理
          • JDK动态代理
            • Cglib动态代理
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档