初探设计模式——代理模式

137 阅读3分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

1.定义

给一个对象提供一个代理,并且由代理对象控制对原对象的引用。

2.模式结构

代理模式有3个角色:

  • 抽象主题角色:Subject
  • 代理主题角色:Driver
  • 被代理主题角色:Boss

3.代码分析

代码案例:老板要去机场,但是老板在前往机场的过程中要处理一些工作,所以就要找个司机来替他开车,案例中老板是被代理对象,司机是代理对象。

 /**
 * 抽象主题角色
 */
public static abstract class Subject {
    public abstract void drive();
}

/**
 * 代理角色:司机
 */
public static class Driver extends Subject {
    Subject boss;

    public Driver(Subject boss) {
        this.boss = boss;
    }

    @Override
    public void drive() {
        System.out.println("老板,去哪");
        boss.drive();
    }
}

/**
 * 被代理角色:老板
 */
public static class Boss extends Subject {

    @Override
    public void drive() {
        System.out.println("送我去机场");
    }
}

/**
 * 具体使用
 */
public static void main(String[] args) {
    Subject boss = new Boss();
    Subject driver = new Driver(boss);
    driver.drive();
}

运行结果如下:
老板,去哪
送我去机场

4.优点

  • 代理模式可以协调调用者和被调用者,在一定程度上降低了系统代码的耦合度;
  • 虚拟代理通过使用一个小对象来代表一个大对象在一定程度上可以合理利用资源;
  • 远程代理可以使客户端访问远程机器上的对象,远程机器可能具有更好的性能、更快的响应速度等,

5.缺点

  • 由于客户端和真实对象之间存在一个代理对象,因此消息传递的过程会有一定的延迟;
  • 实现代理模式需要做一些额外的工作,有些代理模式也很复杂。

6.适用环境

  • 远程代理:为一个位于不同地址空间的对象提供一个本地代理对象,这个不同的地址空间可以是同一台主机中也可以不是
  • 虚拟代理:如果需要创建一个资源消耗较大的对象时可以先创建一个消耗资源较小的对象来表示,需要用到大资源时再创建,这样可以合理利用有限的资源空间
  • 保护代理:对一个对象进行限制访问,针对不同调用者提供不同的权限
  • 防火墙代理:保护目标不被恶意用户介入
  • 同步化代理:使几个用户能通同时调用一个对象而不产生冲突

7.扩展

  • 图片代理:大图浏览常用。
  • 用户通过浏览器访问网页时先不加载真实的大图,而是通过代理对象处理,先创建一个线程加载小图片,然后再创建一个线程调用加载大图的方法将大图加载到客户端显示,当客户端要查看大图时开启一个新的网页展示大图,如果此时大图还没有加载完毕,再创建一个线程来展示相应信息。通过代理技术并结合多线程编程将大图的加载流程放在后台操作,不影响前台图片的浏览。
  • 远程代理:远程代理可以将网络的细节隐藏起来,客户完全可以认为被代理的远程业务对象是局域网,而远程代理对象承担了大部分的网络通信工作。
  • 虚拟代理:一种合理利用资源的代理方式,是一种内存节省技术,当需要加载一个消耗资源较大的对象时可以推迟到使用它时在进行加载。

参考链接:代理模式