【问题标题】:Observer pattern that has specific "observable/subscriber" relationship具有特定“可观察/订阅者”关系的观察者模式
【发布时间】:2017-03-22 01:07:38
【问题描述】:

我一直在尝试创建一个基本的观察者模式,它使用泛型类型在可观察对象和它的订阅者之间创建紧密耦合的关系。以 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 并将其传递给另一个同名方法.

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

【问题讨论】:

    标签: java c# generics observer-pattern


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 2016-06-26
        • 1970-01-01
        • 2016-02-20
        • 2023-04-10
        • 1970-01-01
        相关资源
        最近更新 更多