是否有用Python实现的GoF
Observer的示例示例?我有一个位代码,当前有一些调试代码通过键类附加(如果设置了魔术环境,当前会向stderr生成消息)。此外,该类还具有一个接口,用于递增地返回结果以及将其存储在内存中以进行后处理。(该类本身是一个作业管理器,用于通过ssh在远程计算机上并发执行命令)。
当前,该类的用法类似于:
job = SSHJobMan(hostlist, cmd)
job.start()
while not job.done():
for each in job.poll():
incrementally_process(job.results[each])
time.sleep(0.2) # or other more useful work
post_process(job.results)
一种替代用法模型是:
job = SSHJobMan(hostlist, cmd)
job.wait() # implicitly performs a start()
process(job.results)
这对于当前的实用程序来说一切正常。但是,它确实缺乏灵活性。例如,我目前支持简短的输出格式或进度条作为增量结果,也支持该post_process()
功能的简短,完整和“合并的消息”输出。
但是,我想支持多个结果/输出流(到终端的进度条,对日志文件的调试和警告,从成功作业到一个文件/目录的输出,错误消息以及从不成功作业到其他结果的其他结果)等)。
这听起来像是一种情况,要求Observer …让我的类的实例接受其他对象的注册,并在事件发生时使用特定类型的事件进行回调。
我正在查看PyPubSub,因为我在SO相关问题中看到了对此的一些引用。我不确定是否已准备好将外部依赖项添加到我的实用程序中,但是如果这样做可以使其他人更容易使用,则可以看到将其接口用作我的模型的价值。(该项目既可以用作独立的命令行实用程序,也可以用作编写其他脚本/实用程序的类)。
简而言之,我知道该怎么做…但是有很多方法可以实现它。从长远来看,我想就最可能对其他代码用户起作用的建议。
代码本身位于:classh。
但是,它确实缺乏灵活性。
好吧……实际上,如果您想要异步API,那么对我来说这似乎是一个不错的设计。通常是这样。也许您所需要的只是从stderr切换到Python的logging
模块,该模块具有自己的发布/订阅模型,Logger.addHandler()
以及诸如此类的东西。
如果您确实想支持观察者,我的建议是使其保持简单。您实际上只需要几行代码。
class Event(object):
pass
class Observable(object):
def __init__(self):
self.callbacks = []
def subscribe(self, callback):
self.callbacks.append(callback)
def fire(self, **attrs):
e = Event()
e.source = self
for k, v in attrs.iteritems():
setattr(e, k, v)
for fn in self.callbacks:
fn(e)
您的Job类可以子类化Observable
。发生感兴趣的事情时,请致电self.fire(type="progress", percent=50)
或类似电话。
主要内容:介绍,实现,Subject.java,Observer.java,BinaryObserver.java,OctalObserver.java,HexaObserver.java,ObserverPatternDemo.java当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知
观察者模式 亦称: 事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 问题 假如你有两种类型的对象: 顾客和 商店 。 顾客对某个特定品牌的产品非常感兴趣 (例如最新型号的 iPhone 手机), 而该产品很快将会在商店里出售。 顾客
一、定义 观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式。 好处: (1)可广泛应用于异步编程中,是一种替代传递回调函数的方案。 (2)可取代对象之间硬编码的通知机制,一个对象不用再显示地调用另外一个对象的某个接口。两对象轻松解耦。 二、DOM事件–观察者
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)
观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 定义一个目标构造函数,并实现绑定、解绑和触发等方法: function Subject() { this.events = {}; this.count = 0; } Subj
问题 当一个事件发生时你不得不向一些对象发布公告。 解决方案 使用观察者模式(Observer Pattern)。 class PostOffice constructor: () -> @subscribers = [] notifyNewItemReleased: (item) -> subscriber.callback(item) for s