代理模式用于构造具有解耦组件的分布式系统。这些组件可以通过远程服务调用彼此交互。代理组件负责组件之间的通信协调。
服务器将其功能(服务和特征)发布给代理。客户端从代理请求服务,然后代理将客户端重定向到其注册中心的适当服务。
使用场景:
• 消息代理软件,如Apache ActiveMQ,Apache Kafka,RabbitMQ和JBoss Messaging


代理模式用于在结构化系统中对组件解耦。系统内各组件间采用远过程调用的方式交互。代理组件充当组件间通讯的协调角色。提供服务的组件将其能力(服务以及特性)发布给代理,客户端均向代理请求服务,由代理将请求重定向到先前已发布过对应服务的组件进行处理。
代理模式在软件架构上具有非常明显的特点,优点与缺点都是十分的突出。
代理模式的优点:
(1)通过一个代理对象完成一系列的处理,在将来的程序改动中,就会允许动态更改、添加、删除和重新定位对象,这使开发人员的发布变得透明,符合开闭原则。
(2)代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
(3)远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算机性能与处理速度,可以快速响应并处理客户端请求。
(4)代理模式在架构中还可以让虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
另外代理模式的缺点也是很突出的。
代理模式的缺点:
  (1)要求对服务描述进行标准化,我们要使用代理模式时则需要考虑异步处理机制、协议创建流程和错误环境控制,比较的繁琐。
(2)由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
(3)实现代理模式需要额外的工作,有些代理模式的实现非常复杂。这些问题就造成了不易开发的弱点。
  代理模式是通过引入代理对象来间接访问一个对象,代理模式可以在客户端和目标对象中起到一个中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。
  代理模式在java框架中也有应用,例如spring中AOP技术就是代理模式的应用,只不过是应用较为高级的动态代理模式。另外EJB、Web Service等分布式技术都是代理模式的应用。其实在设计模式中也有代理模式,这就需要分别以下两者的区别,设计模式是架构的手段(之一)。软件架构 :一般场景下拥有设计的选择权;设计模式 :选择后特定场景下的最佳实践,两者的范围还是有很大的差别的,另外我认为如果把做一个项目当成一场战争的话,那么架构就是这场战争的总元帅,而设计模式只是执行命令的一位将军。
  总的来说代理模式作为软件架构模式的常用模式,应用的范围还是十分的广泛:
   (1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。
  (2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。
   (3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
  (4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。
  (5) 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。
  所以我们如果要进行软件架构使用代理模式去应用特定的场景,一定要选择正确的方法,会让我们的架构使得项目变得更加简单。