- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
设计模式-主动对象(ActiveObject)
译者注:
1. 对象分为主动对象和被动对象,主动对象内部包含⼀个线程,可以⾃动完成动作或改变状态,⽽⼀般的被动对象只能通过被其他对象调⽤
才有所作为。在多线 序中,经常把⼀个线程封装到主动对象⾥⾯。
2. 在翻译过程中,发现的原⽂不妥处被更正。
3. 原⽂中许多内容⼀再重复,颇有蛇⾜之感,取精⽤宏,删繁就简。
4. 尝试更⾼程度的意译。
关键词
这个⽂章介绍主动对象模式,主动对象是内部拥有⾃⼰的控制线程的对象。为了简化异步调⽤的复杂性,这个模式分离了⽅法的执⾏和调
⽤。使⽤这个模式,⼀个对象中⽆论是否有独⽴的线程,客户从外部访问它时,感觉是⼀样的。⽣产者/消费者,读者/写者,这两个应⽤⼴
泛的模型中,这种策略⾮常适合。这个模式常⽤在多线程的,分布式系统中。另外,⼀些客户端应⽤,如:视窗系统和⽹络浏览器,也可以
使⽤主动对象模式,对并⾏的、异步调起的IO操作简化处理。
1 ⽬的
主动对象模式隔离了⽅法执⾏和⽅法调⽤的过程,提⾼了并⾏性,对内部拥有控制线程的主动对象,降低了异步访问的复杂性。
2 别名
并⾏⾏为对象(Concurrent Object and Actor)
3 例⼦
为了说明主动对象模式,考虑⼀个通信⽹关的设计。⽹关隔离互相协作的多个组成单元,让交互过程不直接依赖于对⽅。参照图1,⼀个分
布式系统中,来⾃多个⽣产者(卫星设备)的消息,被⽹管转发给多个消费者(局域⽹内的主机)。
我们的例⼦中,⽣产者和消费者使⽤TCP协议通信,这是⾯向连接的通信协议。⽹关上的进程向消费者发送数据时,操作会发⽣阻塞。这是
因为,⽹络传输能⼒有限,TCP进⾏流量控制,防⽌过量的数据不能及时缓冲和处理。
要提⾼整体的效率,⽹关处理进程不能因⼀个连接上的阻塞⽽等待。另外,当⽣产者和消费者的数⽬增加的时候,整个进程必须相应的增加
处理能⼒(译者注:通过增加处理线程)。
⼀个提⾼性能的有效⽅法,就是使⽤并⾏。应⽤并⾏后,服务对象拥有独⽴线程,线程实际完成操作,和⽅法调⽤的过程分开。并且,不同
线程处理不同TCP连接,⼀个连接上的线程被阻塞,不会影响到其他连接的线程。
4 场景
对象的访问者(Client,下统称为客户)和对象的实现在不同的线程中。
5 问题
许多应⽤场景,服务者并⾏处理多客户端的请求,提⾼服务的质量(QoS)。被动对象在客户线程中完成操作过程,主动对象使⽤专⽤的线
程完成。⼀个对象的数据被多个线程共享时,必须处理好线程的同步。这导致三个约束。
1. 对⼀个对象调⽤不能阻塞整个进程,不能影响其他线程的执⾏:⽐如,通信⽹关的例⼦中,⼀个TCP连接上的数据传送被阻塞,整个进
程仍然能继续处理。同样,其他没有被阻塞的⽹络连接,应该正常的发送数据。
2. 对共享对象同步访问的逻辑应该简化:客户在使⽤共享对象地时候,如果⾯对底层的同步机制,必须记得先要获取互斥锁,后要释放互斥
锁,编码就⽐较⿇烦。⼀般情况,共享对象的⽅法隐藏这些细节,当多个客户线程访问同⼀个对象时,这些约束是透明的。
3. 存在可以平⾏进⾏的操作,设计成同时执⾏:在通信⽹关的例⼦中,同时使⽤多个TCP连接给不同的消费者发送数据。如果⽹关的进
在单个线程上执⾏,及时使⽤多个处理器不能明显的提⾼性能。
6 ⽅案
对每⼀个要求并发执⾏的对象,分离其⽅法的调⽤和执⾏。这样,这个对象的客户就像是调⽤⼀个常规的⽅法⼀样。这个⽅法,⾃动把任务
交给另外的线程完成执⾏。
主动对象的组成:⼀个代理者(Proxy)实现外部的访问接⼝;⼀个执⾏者(Servant)。代理和执⾏者在不同的线程执⾏,分离⽅法调⽤
和执⾏的过程:代理者在客户线程中被调⽤执⾏,执⾏者在另外的线程完成操作。运⾏时,代理者把客户的调⽤信息封装“调⽤请
求”(Method Request),通过调度者(Scheduler)把这个请求放到⼀个活动队列(Activation Queue)。调度者和执⾏者运⾏在另
外的线程中,这个线程启动后,不断地从活动队列中得到“调⽤请求”对象,派发给执⾏者完成客户请求的操作。客户调⽤代理者后马上得
到⼀个预约容器(Future),今后可以通过这个预约容器得到返回的结果。
7 结构
下⾯使⽤Booch风格的类图,对主动对象的组成结构进⾏说明。(译者注:这是Booch在《⾯向对象的分析和设计》书中使⽤的类图风格)
在这个模式中,共有六个参与者。
代理者(Proxy)
代理者定义了被客户调⽤的接⼝。这个接⼝是函数调⽤的⽅式,⽽不是像传统线程通信,使⽤数据传递的⽅式。当函数被调⽤的,代理者构
造⼀个“调⽤请求”对象,并把
原创力文档


文档评论(0)