设计模式之代理模式:为对象提供一个“替身”

开发 前端
代理模式是一种强大的设计模式,它允许开发者在不修改现有类的情况下增加新的功能或控制访问。通过使用代理,我们可以轻松地实现对对象的访问控制、日志记录、性能监测等,从而提高系统的可扩展性和可维护性。

在软件开发中,设计模式是一种经过验证的最佳实践,用于解决在软件设计中经常遇到的问题。代理模式是一种结构型设计模式,它提供了一种将类的功能委托给另一个对象的方法,从而实现对类的功能扩展或控制访问。

代理模式的基本概念

代理模式为其他对象提供一种代理,以控制对这个对象的访问。代理类作为原对象(即委托对象)的替身,可以实现对原对象的操作进行额外的处理,如权限检查、日志记录、性能监测等,而无需修改原对象的代码。

代理模式的结构

代理模式通常包含以下三个角色:

  1. 抽象主题(Subject):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以用代理主题代替。
  2. 真实主题(RealSubject):它定义了代理所代表的实际对象,是负责执行系统功能的实际对象。
  3. 代理(Proxy):它持有一个指向真实主题的引用,从而可以在任何时候操作真实主题对象。在代理中,可以提供额外的操作,如访问控制、日志记录等。

代理模式的应用场景

代理模式在多种场景下都非常有用:

  1. 远程代理:当需要为一个在远程服务器上的对象创建一个本地代表时,可以使用远程代理。客户端可以像操作本地对象一样操作远程代理,而远程代理则会在内部处理网络通信。
  2. 虚拟代理:当对象创建或网络请求的开销较大时,可以使用虚拟代理来延迟这种开销,直到真正需要时才进行。这对于需要加载大量数据或执行复杂初始化的对象特别有用。
  3. 保护代理:保护代理用于控制对原始对象的访问,可以用于实现权限检查、访问控制等功能。
  4. 智能引用代理:当调用真实的对象时,代理处理另外一些事,如记录此次操作日志、计算对象调用次数等。

代理模式的实现

下面是一个简单的代理模式的实现示例:

// 抽象主题接口
interface Subject {
    void doSomething();
}

// 真实主题类
class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("RealSubject is doing something...");
    }
}

// 代理类
class Proxy implements Subject {
    private RealSubject realSubject;

    public Proxy() {
        this.realSubject = new RealSubject();
    }

    @Override
    public void doSomething() {
        System.out.println("Proxy is preparing to do something...");
        realSubject.doSomething(); // 调用真实主题的方法
        System.out.println("Proxy finished doing something...");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Subject subject = new Proxy(); // 使用代理对象而不是真实对象
        subject.doSomething(); // 客户端不知道它是代理还是真实对象
    }
}

在这个例子中,Proxy 类实现了与 RealSubject 相同的接口 Subject,并持有一个 RealSubject 的实例。当客户端调用 doSomething() 方法时,实际上是通过代理类来调用的,代理类可以在调用前后添加额外的操作。

总结

代理模式是一种强大的设计模式,它允许开发者在不修改现有类的情况下增加新的功能或控制访问。通过使用代理,我们可以轻松地实现对对象的访问控制、日志记录、性能监测等,从而提高系统的可扩展性和可维护性。在实际开发中,代理模式被广泛应用于各种场景,如远程方法调用、延迟加载、访问控制等。

责任编辑:武晓燕 来源: 程序员编程日记
相关推荐

2012-02-29 09:41:14

JavaScript

2021-06-29 08:54:23

设计模式代理模式远程代理

2012-01-13 15:59:07

2010-03-25 08:52:30

PHP设计模式代理模式

2022-09-07 08:25:08

代理模式设计模式代码

2024-02-26 11:52:38

代理模式设计

2020-06-22 08:50:27

Spring AOP代理

2021-11-29 09:38:12

设计模式对象池模式Object Pool

2011-04-06 11:41:25

Java动态代理

2019-08-14 16:56:38

Python职责模式请假

2020-08-21 07:23:50

工厂模式设计

2022-11-30 17:05:33

代码程序场景

2021-06-09 08:53:34

设计模式策略模式工厂模式

2015-09-08 13:39:10

JavaScript设计模式

2021-12-24 07:50:45

责任链模式设计

2021-06-16 08:56:06

模版方法模式设计模式行为型设计模式

2023-09-04 13:14:00

装饰器设计模式

2011-11-09 14:54:26

2021-11-05 07:47:56

代理模式对象

2020-12-01 07:16:05

重学设计模式
点赞
收藏

51CTO技术栈公众号