设计模式笔记:代理模式

代理模式

我的理解:
  • 此模式,以一个代理对象来代替真实对象进行使用(代理对象拥有【但不仅仅】所有真实对象对外接口,内部拥有真实对象引用),从而可以在代理中实现对真实对象的访问控制(在调用真实对象方法之前之后进行各种控制)(但是不对真实对象进行修改,同时一般来说,对应方法都会调用真实对象的方法
  • 实现的话,以创建真实类与代理类为重点,真实类实现核心方法,代理类实现控制代码并调用真实方法。而抽象只是抽出相同必要的东东,以便统一接口吧。
  • 同时,我觉得这个代理模式同单例模式可以同时使用,如果内部拥有的真实引用为一个集合,感觉上就像【】;


定义: 为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。

类型:结构型模式

类图:


构建:

  ●   抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
  ●   目标对象角色:定义了代理对象所代表的目标对象。
  ●   代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。

常见代理类型:

1) 远程代理(Remote  Proxy) 为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小_杭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值