`
touchinsert
  • 浏览: 1316382 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

代理(Proxy)模式

阅读更多

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

远程代理(remote proxy)为一个对象在不同的地址空间提供局部代表。

保护代理(Protection proxy)控制对原始对象的访问。

虚拟代理(Virtual proxy)根据需要创建开销很大的对象。

智能指引(Smart Reference)取代简单的指针,它在访问对象时执行一些附加操作。包括对指向对象的引用计数,当第一次引用一个持久对象时,将它载入内存。

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 6in; HEIGHT: 222.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>

参与者:

ProxyImageProxy

保存一个引用使得代理可以访问实体。若realSubjectSubject的接口相同,Proxy会引用Subject

提供一个与Subject的接口相同的接口,这样代理就可以用来代替实体。

控制对实体的存取,并可能负责创建和删除它。

其他功能依赖于代理的类型:

Remote proxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送以编码的请求。

Virtual Proxy可以缓存实体的附加信息,以便延迟对它的访问。

Protection Proxy检查调用者是否具有实现一个请求所必需的访问权限。

SubjectGraphic

定义RealSubjectProxy的公用接口,这样就在任何使用RealSubject的地方都可以使用Proxy

RealSubjectImage

定义Proxy所代表的实体。

代码

Subject

/**

The Subject defines the common interface for RealSubject and Proxy so that a

* Proxy can be used anywhere a RealSubject is expected.

* @modelguid {F53E01CF-38BC-4532-8A7C-E49269EA26B0}

*/

public interface GraphicSubject {

/** @modelguid {3F5433C7-4967-4588-B350-A5B6089108EE} */

public void Draw();

/** @modelguid {98193698-60AB-44A5-9A90-80637E1171FF} */

public void Save();

/** @modelguid {5A8063C8-8849-4126-9A6B-676635E93F75} */

public void Load(Object o);

}

RealSubject

/**

The RealSubject defines the real object that the proxy represents.

* @modelguid {29F3D9A9-6FB1-4518-8B5C-B213F1E2FBE7}

*/

public class ImageRealSubject implements GraphicSubject {

/** @modelguid {408A6002-D939-4ACF-8D01-F694F69A5E11} */

public ImageRealSubject() {

}

/** @modelguid {A3D4D0AA-EDC1-468A-BFC1-195927B1FF5F} */

public void Draw() {

// add your codes here...

// be sure you update the return type based on your custom operation signature

System.out.println("Draw here");

return;

}

/** @modelguid {E3BF6A53-9276-47FB-AD54-639B29D260CD} */

public void Save(){

System.out.println("Save here");

}

/** @modelguid {FB73AB03-4D33-43E5-9031-5797878FBA83} */

public void Load(Object o){

System.out.println("Load here");

}

}

Proxy

/**

Proxy controls access to the real subject and may be responsible for creating

* and deleting it.

The Proxy maintains a reference that lets the proxy access the real subject.

* Proxy may refer to a Subject if the RealSubject and Subject interfaces are

* the same. It provides an interface identical to Subject's so that a proxy

* can be substituted for the real subject. It also controls access to the

* real subject and may be responsible for creating and deleting it.

Other responsibilities depend on the kind of proxy:

- remote proxies are responsible for encoding a request and its arguements and

* for sending the encoded request to the real subject in a different address

* space.

virtual proxies may cache additional informatin about the real subject so that

* they can postpone accessing it. For example, the ImageProxy for the

* Motivation caches the real image's extent.

- protection proxies check that the caller has the access permissions required

* to perform a request.

* @modelguid {1B76A4ED-C987-47A1-94B5-BDF5A3F19938}

*/

public class ImageProxy implements GraphicSubject {

/** @modelguid {4EE79008-471B-4A7E-AE49-16406E804CBB} */

private ImageRealSubject theRealSubject;

/**

This is the overloaded constructor of the Proxy class.

* @modelguid {7D49A0C9-F9D5-4C24-B6D9-99D667E46623}

*/

public ImageProxy(ImageRealSubject subject) {

this.theRealSubject = subject;

}

/**

This is the default constructor of the Proxy class.

* @modelguid {69DB530A-E37E-4DB6-AABC-6A96F1048363}

*/

public ImageProxy() {

}

/**

This operation is setting "theRealSubject" attribute of the Proxy class.

* @modelguid {E88BF991-2B8C-47B8-BA98-D65819F5B73F}

*/

public void setRealSubject(ImageRealSubject realSubject) {

theRealSubject = realSubject;

}

/**

This is any custom operation from the model. It can implement any logic

* required by your application.

* @modelguid {356AF68C-1BF2-4F8B-83D5-8DEC58BC2341}

*/

public void Draw() {

if (theRealSubject != null)

(theRealSubject).Draw();

}

/** @modelguid {1A9CDEDD-75E2-4C26-9272-C7203804CB73} */

public void Save(){

if (theRealSubject != null)

(theRealSubject).Save();

}

/** @modelguid {BB51C2C8-4302-4493-86DC-7D1F1BDD7DD5} */

public void Load(Object o){

if (theRealSubject != null)

(theRealSubject).Load(o);

}

}

分享到:
评论

相关推荐

    设计模式C++学习之代理模式(Proxy)

    代理模式是一种设计模式,它是结构型模式之一,主要用于在客户端和目标对象之间建立一个代理对象,以便控制对目标对象的访问。在C++中,代理模式可以用来为其他对象提供一种代理以控制对这个对象的访问,或者增加...

    设计模式之代理模式proxy.zip

    JDK动态代理基于接口实现,它要求目标对象必须实现至少一个接口,然后通过Proxy类和InvocationHandler接口来创建并控制代理对象。当我们调用代理对象的方法时,实际执行的是InvocationHandler的invoke方法,这样可以...

    Proxy 模式学习代码

    Proxy模式是一种设计模式,它允许我们为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。这种模式在软件工程中广泛应用,主要用于控制对真实对象的访问,提供额外的功能,如日志、...

    设计模式之代理模式proxy

    **设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...

    设计模式之代理模式Proxy

    代理模式是设计模式中的一种结构型模式,它在对象交互中起到了中介的作用,允许通过代理对象来控制对原对象的访问。代理模式的核心思想是为一个对象提供一个替身,以便增加新的功能或者控制对原对象的访问。这种模式...

    结构型模式之代理模式(Proxy)

    2. 代理对象(Proxy):实现了与目标对象相同的接口,持有目标对象的引用,并在需要时调用目标对象的方法,同时可以添加额外的控制逻辑。 3. 客户端(Client):通过代理对象来访问目标对象,它并不直接与目标对象...

    Proxy代理模式经典实例(绝对OOP)

    在Java中,Proxy模式主要依赖于Java的动态代理机制,这通常涉及到`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`两个核心接口。`Proxy`类用于生成代理对象,而`InvocationHandler`接口定义了...

    c++-设计模式之代理模式(Proxy)

    代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于保护、延迟加载、记录请求等场景,可以在不改变原有对象的情况下为其增加新的功能。 代理...

    代理模式 Proxy Pattern

    ### 代理模式 Proxy Pattern #### 概念定义 代理模式是一种结构型设计模式,它允许程序员为某对象创建一个代理对象来控制对该对象的访问。简单来说,就是在不修改原始类的基础上,通过引入代理对象来扩展类的行为...

    Proxy 代理模式

    Proxy代理模式是设计模式中的一种,它在Java中扮演着重要的角色,特别是在处理远程调用、安全性、缓存以及日志记录等方面。代理模式的基本思想是为一个对象提供一个替身或者占位符,以便控制对这个对象的访问。在这...

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    在这些模式中,代理模式(Proxy Pattern)是一种常用的结构型设计模式,它允许我们为一个对象创建一个代理,该代理对象在客户端和目标对象之间起到中介的作用,可以增加额外的功能或控制访问。 代理模式分为两种...

    proxy.rar java三种代理模式源码

    这个"proxy.rar"压缩包中包含了这三种代理模式的源代码示例,以及对泛型的应用。 1. 静态代理: 静态代理是最基础的代理形式,它通过创建一个代理类来实现目标接口,并在代理类中调用目标对象的方法。这种方式需要...

    代理模式java代码 Proxy(4)

    代理模式是一种设计模式,它允许我们为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用,可以实现额外的功能,比如监控、权限控制、事务管理等,而客户端无需关心这些细节。...

    详解设计模式中的proxy代理模式及在Java程序中的实现

    Proxy模式是设计模式中的一种,它提供了一种对对象访问的控制手段,使得在不修改原有对象的基础上,可以通过代理对象来扩展或增强原有对象的功能。在Java编程中,Proxy模式的应用非常广泛,尤其是在处理远程调用、...

    C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式)

    ### C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式) #### 重要概念:代理模式 代理模式是一种常用的结构型设计模式,它通过为另一个对象提供一个代理,来控制对该对象的访问。这种模式在软件工程中...

    Proxy模式

    在实际应用中,Proxy模式广泛用于数据访问代理、远程代理、虚拟代理和智能引用等场景。 在Proxy模式中,有三个关键角色: 1. **Subject(主题)**:这是原始对象和代理对象共同实现的接口或抽象类,定义了它们的...

    C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式) (Level 300)

    本文将深入探讨C#中的一个关键设计模式——代理模式,它属于结构型模式的一种,适用于管理和控制对象的访问。我们将从概念、分类、实现方式以及实际应用等方面进行详细的讲解。 1. **代理模式概念**: 代理模式是一...

    从房屋买卖看 java proxy 模式

    标题中的“从房屋买卖看 java proxy 模式”暗示了我们将通过一个具体的场景来探讨 Java 中的代理(Proxy)模式。在软件设计中,代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在...

    Android设计模式之代理模式(Proxy Pattern)

    Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口可以实现动态代理。动态代理在Android中常用于实现事件监听、AOP(面向切面编程)等场景。 **Android中的应用** 1. **数据加载**...

Global site tag (gtag.js) - Google Analytics