设计模式(九)主动对象模式

来源:互联网 发布:名著推荐 知乎 编辑:程序博客网 时间:2024/06/05 13:53

1. 用到了command与proxy模式,变成了一个更强大的模式。


2. 一般的command模式是当有请求到来的时候,在主线程中(也可以是其他线程,主线程这里只表示上下文)生成一个command,然后push到命令池(并不是所有的都有命令池的,这也是主动对象不同的地方,主动对象都有单独线程,不是在当前上下文中执行),在命令池线程中执行execute方法,或者在主线程中直接调用execute的方法(在主线程中,并不是异步的调用,这也是与主动对象模式的区别)。


3. 那么这样看来,主动对象与带有命令池的command模式很像了?目前理解差不多,如果所有command的execute方法全部在command内部实现,那么主动对象就变成了对生成命令职责和线程池的外观(不是代理,没有代理的对象,主动对象的代理本意是command的execute的具体方法所依赖的实现具体对象)。


4. 谁是主动对象?并不是上面提到的command,而是代理者是主动对象,直接调用代理者的方法,然后对用用户开看,这个方法就去在其他线程中执行去了,而且这个主动对象中没有任何关于如何分派线程方法的细节,代理者中有一个schedule者持有线程,一般schedule在构造函数中就启动一个线程。


5. 这个模式也可以用来重构对象,把一个被代理者重构成一个主动对象,而不需要更改被代理者的任何代码。


6. 被代理者中持有一个schedule和具体的被代理实现者,一般command的execute方法,可以在command中实现,也可以在被代理者中实现。这个主要看使用情况,从面向对象的角度来开,应该在command的execute方法中实现,但是具体情况,具体分析。


7. 主线程中使用代理对象,在代理对象中创建具体的command,相当于把根据请求创建何种对象的职责转移到了代理者中,同样有利于扩展,例如当一个请求对应的command改变的时候,不用更改主线程中代码,直接更改代理对象中的代码就可以了。


8.这个模式特别适用于想把一个同步接口的sdk或dll接口装换成异步的场景。

0 0
原创粉丝点击