远程代理
 

如果功能的利用者和提供者处于同一个线程中的时候,当然可以直接调用接口,但是如果二者处于不同线程中,甚至是不在同一台设备上的时候,就需要代理了。先看类图,是前一篇文章的简化版。

 

Aha!设计模式(68)-代理模式(2)_二维码

LedDisplay是简单的Led大屏显示类,而RemoteDisplayProxy的功能则是当LedDisplay位于其他设备时的代理。如果只看类图可能看不出代理来,接下来看序列图。

 

Aha!设计模式(68)-代理模式(2)_类图_02

 

由于LedDisplay和Actor1处于不同的设备,所以Actor1对于RemoteDisplayProxy的调用,都被转换成不同的命令,发送到位于另一台设备的Stub,Stub再根据命令的内容,调用LedDisplay的对应接口。Stub接收到LedDisplay的返回值之后,再将其发送给RemoteDisplayProxy类,而Remote接收到返回值以后,再返回给Actor1。在此期间Actor1线程一直处于阻塞状态。对于Actor1来讲,不必区分实际的显示装置在哪一台设备上,都按照同样的方式使用Proxy的接口即可。

 

虽然上面是以Actor1和LedDisplay处于不同设备为例进行说明,当二者处于不同线程或者不同进程的时候方式也大致相同,只是通讯手段不同而已。

 


阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

Aha!设计模式(68)-代理模式(2)_类图_03