代理模式/Proxy

代理模式/Proxy

意图/适用场景:

在某些情况下,一个客户不想或者不能够直接引用一个对象,这时可以通过一个“代理”来达到目的。代理对象可以在客户端与目标对象之间起到中介的作用。

对于“墙”内的中国人来说,恐怕“代理”的概念更容易理解。有些国外网站我们在国内无法直接访问,因为GFW“帮”我们过屏蔽了这些网站。如果仍然需要访问的话,就需要设置海外代理(这个方法现在多半不管用了)。代理是我们能够访问到的服务器,而且它能够访问到那些目标网站,就让我们的电脑把访问请求发给这个代理,由代理转发给目标网站;从目标网站回来的数据也是先到达代理,代理把数据转发给我们。对于我们来说,只需要认为“代理”就是目标网站就行了。

UML:

参与者:

  1. Subject: 目标对象与代理对象的公共接口。任何使用目标对象的地方也都可以使用代理对象。
  2. RealSubject: 目标对象,真正的功能实体。
  3. ProxySubject: 代理。它提供与目标对象相同的接口,所有使用目标对象的地主也可以换成代理。客户端只与代理发生联系,对目标的访问都经由代理来间接地进行。当然在这个传递的过程中,代理可以添加一些自己的动作。

相关模式:

代理模式与下面几种模式容易混淆。

  1. 适配器模式:
    • 在适配器模式中,“适配器”角色也位于客户端与目标角色中间,成为一个过渡性的接口。但它的作用在于改变目标角色的接口。
    • 而代理模式并不想要改变接口,而是增加一次“传递”。
  2. 装饰模式:
    • 代理模式与装饰模式也有相似的类结构,但装饰模式的用意在于为目标角色提供更多的功能。
    • 而代理模式并不想追求功能的扩展(虽然也可以增加一些功能),只是目标角色的功能以间接的方式实现。

示例代码:

   [java]
// Source code from file:  ProxySubject.java
package designPatterns.Proxy;

public class ProxySubject implements Subject {
private RealSubject realSubject = null;

public ProxySubject() {
realSubject = new RealSubject();
}

public void request() {
System.out.println("ProxySubject.request()");
preRequest();
realSubject.request();
postRequest();
}

public void preRequest() {
System.out.println("ProxySubject.preRequest()");
}

public void postRequest() {
System.out.println("ProxySubject.postRequest()");
}
}

// Source code from file:  RealSubject.java

package designPatterns.Proxy;

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

// Source code from file:  Subject.java

package designPatterns.Proxy;

public interface Subject {
public void request();
}
[/java]

你可能感兴趣的:(设计模式,it)