代理模式

打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能,这种范例的筹划模式属于结构型模式。
代理模式通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的请求转发给目标对象,同时可以在转发请求前后进行额外的处理。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
介绍

意图

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


  • 代理模式解决的是在直接访问某些对象时可能遇到的问题,例如对象创建成本高、需要安全控制或远程访问等。
利用场景


  • 当需要在访问一个对象时进行一些控制或额外处理时。
实现方式


  • 增长中间层:创建一个代理类,作为真实对象的中间层。
  • 代理与真实对象组合:代理类持有真实对象的引用,并在访问时进行控制。
关键代码


  • 代理类:实现与真实对象类似的接口,并添加额外的控制逻辑。
  • 真实对象:实际执行任务的对象。
应用实例


  • 快捷方式:Windows系统中的快捷方式作为文件或步伐的代理。
  • 角色饰演:孙悟空作为高翠兰的代理,猪八戒无法区分。
  • 代售点:购买火车票时,代售点作为火车站的代理。
  • 支票:作为银行账户资金的代理,控制资金的访问。
  • Spring AOP:利用代理模式来实现面向切面编程。
优点


  • 职责分离:代理模式将访问控制与业务逻辑分离。
  • 扩展性:可以灵活地添加额外的功能或控制。
  • 智能化:可以智能地处理访问请求,如延迟加载、缓存等。
缺点


  • 性能开销:增长了代理层可能会影响请求的处理速度。
  • 实现复杂性:某些范例的代理模式实现起来可能较为复杂。
利用发起


  • 根据具体需求选择合适的代理范例,如远程代理、假造代理、掩护代理等。
  • 确保代理类与真实对象接口同等,以便客户端透明地利用代理。
注意事项


  • 与适配器模式的区别:适配器模式改变接口,而代理模式不改变接口。
  • 与装饰器模式的区别:装饰器模式用于加强功能,代理模式用于控制访问。
结构

主要涉及到以下几个焦点角色:

  • 抽象主题(Subject):

    • 定义了真实主题和代理主题的共同接口,这样在任何利用真实主题的地方都可以利用代理主题。

  • 真实主题(Real Subject):

    • 实现了抽象主题接口,是代理对象所代表的真实对象。客户端直接访问真实主题,但在某些环境下,可以通过代理主题来间接访问。

  • 代理(Proxy):

    • 实现了抽象主题接口,并持有对真实主题的引用。代理主题通常在真实主题的基础上提供一些额外的功能,例如延迟加载、权限控制、日志记录等。

  • 客户端(Client):

    • 利用抽象主题接口来操作真实主题或代理主题,不需要知道具体是哪一个实现类。

实现

我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,淘汰 RealImage 对象加载的内存占用。
ProxyPatternDemo 类利用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行体现。
步骤 1

创建一个接口。
Image.java

public interface Image { void display(); }步骤 2

创建实现接口的实体类。
RealImage.java

public class RealImage implements Image { private String fileName; public RealImage(String fileName){ this.fileName = fileName; loadFromDisk(fileName); } @Override public void display() { System.out.println("Displaying " + fileName); } private void loadFromDisk(String fileName){ System.out.println("Loading " + fileName); } }ProxyImage.java

public class ProxyImage implements Image{ private RealImage realImage; private String fileName; public ProxyImage(String fileName){ this.fileName = fileName; } @Override public void display() { if(realImage == null){ realImage = new RealImage(fileName); } realImage.display(); } }步骤 3

当被请求时,利用 ProxyImage 来获取 RealImage 类的对象。
ProxyPatternDemo.java

public class ProxyPatternDemo { public static void main(String[] args) { Image image = new ProxyImage("test_10mb.jpg"); // 图像将从磁盘加载 image.display(); System.out.println(""); // 图像不需要从磁盘加载 image.display(); } }步骤 4

执行步伐,输出结果:
  1. Loading test_10mb.jpg
  2. Displaying test_10mb.jpg
  3. Displaying test_10mb.jpg
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表