我一直在尝试创建一个基本观察者模式,它使用泛型类型在可观察对象与其订阅者之间创建紧密耦合的关系。以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类型的对象。有没有办法完成这种观察者模式而没有松散的线程或可疑的代码?
答案 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表示提供通知信息的类[数据传输对象] ......