您的位置:首页 > 其它

设计模式笔记:代理模式

2016-04-26 10:08 295 查看

代理模式

我的理解:此模式,以一个代理对象来代替真实对象进行使用(代理对象拥有【但不仅仅】所有真实对象对外接口,内部拥有真实对象引用),从而可以在代理中实现对真实对象的访问控制(在调用真实对象方法之前之后进行各种控制)(但是不对真实对象进行修改,同时一般来说,对应方法都会调用真实对象的方法)实现的话,以创建真实类与代理类为重点,真实类实现核心方法,代理类实现控制代码并调用真实方法。而抽象只是抽出相同必要的东东,以便统一接口吧。同时,我觉得这个代理模式同单例模式可以同时使用,如果内部拥有的真实引用为一个集合,感觉上就像【池】;定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。类型:结构型模式类图:构建:  ●  抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。  ●  目标对象角色:定义了代理对象所代表的目标对象。  ●  代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。

常见代理类型:

1)远程代理(Remote Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)2)虚拟代理(VirtualProxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 3)保护代理(ProtectionProxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。4)智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。5)Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。

其他相关模式:

1)适配器模式Adapter:适配器Adapter为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。2)装饰器模式Decorator:尽管Decorat19af4or的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。

示例

代码一:简单代理(只是对真实对象之前之后进行附加处理/控制处理)
抽象
publicabstractclassAbstractObject{
//操作
publicabstractvoidoperation();
}
真实对象
 
publicclassRealObjectextendsAbstractObject{
@Override
publicvoidoperation(){
//一些操作
System.out.println("一些操作");
}
}
代理对象
publicclassProxyObjectextendsAbstractObject{
RealObjectrealObject=newRealObject();
@Override
publicvoidoperation(){
//调用目标对象之前可以做相关操作
System.out.println("before");
realObject.operation();
//调用目标对象之后可以做相关操作
System.out.println("after");
}
}
publicclassClient{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
AbstractObjectobj=newProxyObject();
obj.operation();
}
}
代码二:虚拟代理
虚拟代理(VirtualProxy):根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表
 
示,真实对象只会在需要时才会被真正创建。
publicinterfaceImage
{
publicvoidshow();
}
 
publicclassBigImageimplementsImage
{
publicBigImage()
{
//Thread.sleep(3000);//forsimulatingtoloadthebigimages
System.out.println("createthebigimages");
}
 
@Override
publicvoidshow()
{
System.out.println("showthebigimages");
}
}
 
publicclassImageProxyimplementsImage
{
Imageimage;
 
publicImageProxy()
{
 
}
 
publicImageProxy(finalImageimage)
{
this.image=image;
}
这个代理的处理方法中,在为空是可以显示小的图片对象
还可以做其他各种的控制处理
@Override
publicvoidshow()
{
if(this.image==null)
{
this.image=newBigImage();
}
this.image.show();
}
}
 
publicclassClient
{
publicstaticvoidmain(finalString[]args)
{
System.out.println("bigimage:");
finalImagebigImage=newBigImage();
bigImage.show();
 
System.out.println("imageproxy:");
finalImageimageProxy=newImageProxy();
imageProxy.show();
}
}
结果:
createthebigimages
showthebigimages
imageproxy:
createthebigimages
showthebigimages
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息