观察者模式具有特定的"可观察/订阅者"关系

时间:2017-03-22 01:07:39

标签: java c# generics observer-pattern

我一直在尝试创建一个基本观察者模式,它使用泛型类型在可观察对象与其订阅者之间创建紧密耦合的关系。以YouTube为例;频道将是可观察对象,订阅者将是YouTube用户。 YouTube频道只能由YouTube用户订阅,而YouTube用户只能订阅频道。因此,例如,您无法使用YouTube帐户订阅月度俱乐部的报纸或果冻。

我的第一个想法是做这样的事情:

abstract class Observable<T> where T : Subscriber

abstract class Subscriber<T> where T : Observable

但是这不起作用,因为在这两种情况下T都需要扩展一个包含特定泛型类型的类,使得泛型类型无用。

我的第二个想法是做这样的事情:

abstract class Observable<T> : IObservable where T : ISubscriber

abstract class Subscriber<T> : ISubscriber where T : IObservable

这有效,但并不完全安全。例如,IObservable有一个方法Subscribe(ISubscriber subscriber),而Observable有方法Subscribe(T t)接口方法Subscribe的实现只是将给定的ISubscriber强制转换为类型T和将它传递给同名的另一个方法。

由于接口方法必须是公共的,因此从技术上讲,只要它是ISubscriber,您就可以尝试订阅非T类型的对象。有没有办法完成这种观察者模式而没有松散的线程或可疑的代码?

2 个答案:

答案 0 :(得分:0)

添加观察者时检查实例类型

// in you observer class
public void subscribe(ISubscriber s) {
  if( s instanceof YouTubeSubscriber) {
       System.out.println("Subscriber added");
  } else {
    // ignore the subscriber
    System.out.println("Subscriber rejected");
  }
}

答案 1 :(得分:0)

好主意!这种模式非常有用,IObservable是一个内置的.Net接口。 MSDN documentation提供了更多详细信息。您的订阅者想法由IObserver表示,也是documented on MSDN

  

IObserver和IObservable接口为基于推送的通知提供了一种通用机制,也称为观察者设计模式。 IObservable接口表示发送通知的类(提供者); IObserver接口表示接收它们的类(观察者)。 T表示提供通知信息的类[数据传输对象] ......