代理模式
我的理解:
- 此模式,以一个代理对象来代替真实对象进行使用(代理对象拥有【但不仅仅】所有真实对象对外接口,内部拥有真实对象引用),从而可以在代理中实现对真实对象的访问控制(在调用真实对象方法之前之后进行各种控制)(但是不对真实对象进行修改,同时一般来说,对应方法都会调用真实对象的方法)
- 实现的话,以创建真实类与代理类为重点,真实类实现核心方法,代理类实现控制代码并调用真实方法。而抽象只是抽出相同必要的东东,以便统一接口吧。
- 同时,我觉得这个代理模式同单例模式可以同时使用,如果内部拥有的真实引用为一个集合,感觉上就像【池】;
定义:
为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。
类型:结构型模式
类图:
构建:
●
抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
● 目标对象角色:定义了代理对象所代表的目标对象。
● 代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
● 目标对象角色:定义了代理对象所代表的目标对象。
● 代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
常见代理类型:
1) 远程代理(Remote Proxy)
为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
2) 虚拟代理(Virtual Proxy) 根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
3) 保护代理(Protection Proxy) 控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
4) 智能指引(Smart Reference) 取代了简单的指针,它在访问对象时执行一些附加操作。
5) Copy-on-Write代理: 它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
2) 虚拟代理(Virtual Proxy) 根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
3) 保护代理(Protection Proxy) 控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
4) 智能指引(Smart Reference) 取代了简单的指针,它在访问对象时执行一些附加操作。
5) Copy-on-Write代理: 它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
其他相关模式:
1)适配器模式Adapter:适配器Adapter 为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。
2) 装饰器模式Decorator:尽管Decorator的实现部分与代理相似,但 Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。
示例
代码一:简单代理
(只是对真实对象之前之后进行附加处理/控制处理)
抽象
public abstract class AbstractObject {
//操作
public abstract void operation();
}
真实对象
public class RealObject extends AbstractObject {
@Override
public void operation() {
//一些操作
System.out.println("一些操作");
}
}
代理对象
public class ProxyObject extends AbstractObject{
RealObject realObject = new RealObject();
@Override
public void operation() {
//调用目标对象之前可以做相关操作
System.out.println("before");
realObject.operation();
//调用目标对象之后可以做相关操作
System.out.println("after");
}
}
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractObject obj = new ProxyObject();
obj.operation();
}
}
代码二:虚拟代理
虚拟代理(Virtual Proxy):根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表
示,真实对象只会在需要时才会被真正创建。
public interface Image
{
public void show();
}
public class BigImage implements Image
{
public BigImage()
{
//Thread.sleep(3000);//for simulating to load the big images
System.out.println("create the big images");
}
@Override
public void show()
{
System.out.println("show the big images");
}
}
public class ImageProxy implements Image
{
Image image;
public ImageProxy()
{
}
public ImageProxy(final Image image)
{
this.image = image;
}
这个代理的处理方法中,在为空是可以显示小的图片对象
还可以做其他各种的控制处理
@Override
public void show()
{
if (this.image == null)
{
this.image = new BigImage();
}
this.image.show();
}
}
public class Client
{
public static void main(final String[] args)
{
System.out.println("big image:");
final Image bigImage = new BigImage();
bigImage.show();
System.out.println("image proxy:");
final Image imageProxy = new ImageProxy();
imageProxy.show();
}
}
结果:
create the big images
show the big images
image proxy:
create the big images
show the big images