ACE包装外观模式 UML类图中演示:
图2-1 包装外观模式的参与者的结构
包装外观模式中的关键参与者包括:
函数(Function):函数是现有的低级函数和数据结构,它们提供内聚的(cohesive)服务。
包装外观(Wrapper
Fa?ade):包装外观是封装函数和与其相关联的数据结构的一个或一组类。包装外观提供的方法将客户调用转发给一或多个低级函数。
包装外观模式中的各种协作:
图2-2 包装外观模式中的协作
如下所述,这些协作是十分简单明了的:
1.
客户调用(Client invocation):客户通过包装外观的实例来调用方法。
2.
转发(Forwarding):包装外观方法将请求转发给它封装的一或多个底层函数,并传递函数所需的任何内部数据结构
线程专有存储(Thread-Specific Storage)模式,该模式可减轻多线程性能和编程复杂性的若干问题。通过允许多个线程使用一个逻辑上的全局访问点来获取线程专有数据,而又不给每次访问带来锁定开销,线程专有存储模式可改善性能,并简化多线程应用。
线程专有存储中的以下参与者的结构:
应用线程(Application
Thread)
- 应用线程使用TS Object Proxy(TS对象代理)来访问驻留在线程专有存储中的TS
Object。如5.9所示,线程专有存储模式的实现可以使用“灵巧指针”(smart pointer)来隐藏TS Object Proxy,以使应用看起来像是在直接访问TS Object。
图5-2 线程专有存储模式中的参与者的结构
交互图演示线程专有存储模式中的参与者之间的以下协作:
图5-3 线程专有存储模式中的参与者之间的交互
主动对象(Active Object)模式主动对象设计模式使方法执行与方法调用去耦合,以增强并发、并简化对驻留在它自己的线程控制中的对象的同步访问。并发对象和Actor.
主动对象由以下组件组成:
代理(Proxy)[5, 2]表示对象的接口,
仆人(Servant)提供对象的实现。代理和仆人运行在分离的线程中,以使方法调用和方法执行能并发运行:代理在客户线程中运行,而仆人在不同的线程中运行。在运行时,代理将客户的方法调用(Method Invocation)转换为
方法请求(Method Request),并由
调度者(Scheduler)将其存储在
启用队列(Activation Queue)中。调度者持续地运行在与仆人相同的线程中,当启用队列中的方法请求变得可运行时,就将它们出队,并分派给实现主动对象的仆人。客户可通过代理返回的“
期货”(future)获取方法执行的结果。
期货(Future)
期货[7, 8]允许客户在仆人结束方法的执行后获取方法调用的结果。当客户通过代理调用方法时,期货被立即返回给客户。期货为被调用的方法保留空间,以存储它的结果。当客户想要获取这些结果时,它可以阻塞或者轮询,直到结果被求值和存储到期货中,然后与期货“会合”
主动对象模式中的协作的三个阶段:
- 方法请求构造和调度:在此阶段,客户调用代理上的方法,从而触发方法请求的创建;方法请求维护方法的参数绑定,以及其他任何执行方法和返回结果所需的绑定。代理随后将方法请求传递给调度者,后者将其放入启用队列中。如果方法被定义为“两路”(two way)[6]的,一个期货的绑定被返回给调用该方法的客户。如果方法被定义为“单路”(oneway)的,就没有期货被返回,也就是,它没有返回值。
- 方法执行:在此阶段,调度者在与其客户不同的线程中持续运行。在此线程中,调度者监控启用队列,并确定哪些方法请求已成为可运行的,例如,当它们的同步约束已被满足时。当方法请求成为可运行的,调度者就使其出队,绑定到仆人,并分派仆人上的适当方法。当此方法被调用时,它可以访问/更新它的仆人的状态并创建它的结果。
- 完成:在
最后的阶段中,结果(如果有的话)被存储在期货中,而调度者持续地监控启用队列中,看是否有可运行的方法请求。在一个两路方法完成后,客户可以通过与期货
会合来获取它的结果。一般而言,任何与期货会合的客户都可以获取它的结果。当方法请求和期货不再被引用时,它们就被删除或被垃圾回收。
阅读(822) | 评论(0) | 转发(0) |