设计模式笔记:代理模式
2016-04-26 10:08
295 查看
代理模式
我的理解:此模式,以一个代理对象来代替真实对象进行使用(代理对象拥有【但不仅仅】所有真实对象对外接口,内部拥有真实对象引用),从而可以在代理中实现对真实对象的访问控制(在调用真实对象方法之前之后进行各种控制)(但是不对真实对象进行修改,同时一般来说,对应方法都会调用真实对象的方法)实现的话,以创建真实类与代理类为重点,真实类实现核心方法,代理类实现控制代码并调用真实方法。而抽象只是抽出相同必要的东东,以便统一接口吧。同时,我觉得这个代理模式同单例模式可以同时使用,如果内部拥有的真实引用为一个集合,感觉上就像【池】;定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。类型:结构型模式类图:常见代理类型:
1)远程代理(Remote Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)2)虚拟代理(VirtualProxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 3)保护代理(ProtectionProxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。4)智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。5)Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。其他相关模式:
示例
代码一:简单代理(只是对真实对象之前之后进行附加处理/控制处理)抽象
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
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用