代理模式

title

代理模式(Proxy Pattern)是一种结构型设计模式,用于在不改变原始对象的情况下,为其提供代理对象,以控制对原始对象的访问。

代理模式通常用于以下情况:

  • 远程代理:用于在不同进程或计算机之间进行通信。
  • 虚拟代理:用于延迟加载或计算昂贵的对象。
  • 安全代理:用于控制对敏感对象的访问权限。
  • 智能代理:用于添加附加行为,例如缓存或日志记录。

代理模式通常包括以下组件:

  • 抽象主题(Subject):定义了代理对象和原始对象的公共接口。
  • 具体主题(Concrete Subject):实现了抽象主题接口,是代理模式中的原始对象。
  • 代理(Proxy):实现了抽象主题接口,并包含一个对具体主题的引用。
  • 客户端(Client):使用代理对象来调用具体主题。

下面是一个代理模式的Java示例,演示了如何使用代理模式来控制对敏感对象的访问权限。

首先,我们定义一个Subject接口,它包含一个request方法:

public interface Subject {
    void request();
}

然后,我们定义一个具体的Subject类RealSubject,它实现了Subject接口:

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

接下来,我们定义一个代理类Proxy,它实现了Subject接口,并包含一个对RealSubject的引用。Proxy类可以在执行request方法之前或之后添加一些附加行为,例如检查权限或记录日志:

public class Proxy implements Subject {
    private RealSubject realSubject;

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

    @Override
    public void request() {
        if (checkAccess()) {
            realSubject.request();
            logRequest();
        }
    }

    private boolean checkAccess() {
        System.out.println("Proxy: Checking access prior to executing request.");
        return true;
    }

    private void logRequest() {
        System.out.println("Proxy: Logging the time of request.");
    }
}

最后,我们可以使用代理类来访问具体主题:

Subject subject = new Proxy();
subject.request();
// Output:
// Proxy: Checking access prior to executing request.
// RealSubject: Handling request.
// Proxy: Logging the time of request.

通过使用代理模式,我们可以在不改变RealSubject对象的情况下,添加附加行为来控制对它的访问。这可以使我们更好地控制敏感对象的访问权限,并且可以在需要时添加附加行为,而无需修改RealSubject对象的代码。

powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:01

results matching ""

    No results matching ""