首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有特定“可观察/订阅者”关系的观察者模式

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

Stack Overflow用户
提问于 2017-03-22 01:07:38
回答 2查看 346关注 0票数 0

我一直在尝试创建一个基本的观察者模式,它使用泛型类型在可观察对象和它的订阅者之间创建一个紧密耦合的关系。例如,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),可观察的方法有Subscribe(T t)接口方法Subscribe的实现只是将给定的ISubscriber转换为T类型,并将其传递给同名的其他方法。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-22 01:21:53

好主意!这个模式非常有用,IObservable是一个内置的.Net接口。MSDN文档提供了更多细节。您的订阅者的想法由IObserver表示,也由记录在MSDN上表示。

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

票数 0
EN

Stack Overflow用户

发布于 2017-03-22 01:14:39

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

代码语言:javascript
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42940974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档