最近有人在采访中问我,例如我们是否没有事件和委托,而没有委托和事件,我们如何才能实现Publisher和Subsriber模型的相同功能。
您能举个例子给我解释一下,这将确实有帮助,也将对他人有帮助?
订阅者可以使用ISubscriber
具有方法的接口,而不是使用委托,SomeEvent
而将自身传递给发布者(传递给具有签名的方法Subscribe(ISubscriber subscriber)
)。然后,发布者会将此引用存储到订阅者,并subscriber.SomeEvent
在必要时调用。
就像是:
public interface ISubscriber
{
void SomeEvent(object publisher, object data);
}
public class SomePublisher
{
private readonly HashSet<ISubscriber> subscribers = new HashSet<ISubscriber>();
public void Subscribe(ISubscriber subscriber)
{
subscribers.Add(subscriber);
}
public void Unsubscribe(ISubscriber subscriber)
{
subscribers.Remove(subscriber);
}
public void DoSomething()
{
// Do something
// Then
foreach (var subscriber in subscribers)
{
object data = "Some data";
subscriber.SomeEvent(this, data);
}
}
}
请注意,此发布者/订阅者模型不限于单个“事件”:ISubscriber
可以具有对应于多个“事件”的多种方法。唯一的问题是,如果接口中有多个“事件”,则订阅者必须“订阅”所有事件(必须具有所有事件的方法)。因此,如果中有OnAdded
和OnRemoved
方法ISubscriber
,则实现的类ISubscriber
必须同时具有这两种方法(显然,它们可以是不执行任何操作的空存根)
我将补充一点,最后,可以使用单个方法通过接口“模拟”委托,并且可以将事件视为List<somedelegatetype>
,因此可以将事件视为List<ISomeInterface>
。例如,Java没有委托,而是使用具有单个方法的接口来代替它们(例如,参见Java委托?)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句