Java 观察者模式,具有特定的;可观察/订户“;关系

Java 观察者模式,具有特定的;可观察/订户“;关系,java,c#,generics,observer-pattern,Java,C#,Generics,Observer Pattern,我一直在尝试创建一个基本的观察者模式,它使用泛型类型在可观察对象及其订阅者之间创建一个紧密耦合的关系。以YouTube为例;频道将是可观察的对象,订户将是YouTube用户。YouTube频道只能由YouTube用户订阅,YouTube用户只能订阅频道。例如,你不能使用YouTube帐户订阅报纸或每月果冻俱乐部 我的第一个想法就是这样做: 可观察的抽象类,其中T:Subscriber 抽象类订户,其中T:可观察的 但这不起作用,因为在这两种情况下,T都需要扩展包含特定泛型类型的类,从而使泛型类型

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

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

可观察的抽象类,其中T:Subscriber

抽象类订户,其中T:可观察的

但这不起作用,因为在这两种情况下,T都需要扩展包含特定泛型类型的类,从而使泛型类型无效

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

抽象类可观察:IObservable,其中T:issubscriber

抽象类订阅方:i订阅方,其中T:IObservable

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


由于interfaces方法必须是公共的,从技术上讲,您可以尝试订阅一个不是T类型的对象,只要它是一个ISubscriber。有没有一种方法可以在没有松散线程或可疑代码的情况下实现这种观察者模式?

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

// 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");
  }
}

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

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