到目前为止我找不到答案,可能只是缺少适当的搜索关键字。
我想在C#中实现Observer模式,因此任何Observer对象都可以订阅Subject对象,然后接收所有通知。然后它根据通知类型决定它是否重要。
public class Subject
{
private List<Observer> observers;
public void AttachObserver(Observer Observer)
{
this.observers.Add(Observer);
}
public void DetachObserver(Observer Observer)
{
this.observers.Remove(Observer);
}
public void NotifyObservers(CommonNotification Notification) // who we are, what kind of notification, bla bla
{
foreach(Observer Observer in observers)
{
Observer.OnNotify(Notification);
}
}
}
public class Observer
{
public abstract void OnNotify(CommonNotification Notification);
}
因此,任何想要订阅Subject的对象都需要是Observer类的继承。但是怎么做呢?我的MainForm基于Form。如果我用一般对象替换Observer类,它将不会实现OnNotify()事件。
我在这里错过了什么?我知道我应该使用事件处理程序正确实现它,但为了了解基本设计模式是如何工作的,我首先要自己实现。
答案 0 :(得分:0)
你可以使用Interface而不是像这样的抽象类
public Interface IObserver
{
public void OnNotify(CommonNotification Notification);
}
....
public class MyForm:Form, IObserver {
....
}
答案 1 :(得分:0)
您应该使用接口替换Observer类:
public Interface IObserver
{
public void OnNotify(CommonNotification Notification);
}
然后你的mainform(或其他任何东西)可以实现IObserver
答案 2 :(得分:0)
您可以使用事件轻松实现它。我正在给出一个示例代码 -
public class MyForm : Form
{
public event Action btn1Clicked;
private void button1_Click(object sender, EventArgs e)
{
btn1Clicked();
}
}
public abstract class AbsObserver
{
protected MyForm Form;
public AbsObserver(Subject subject)
{
subject.Attach(OnNotify);
Form = new MyForm();
Form.btn1Clicked += Form_btn1Clicked;
}
void Form_btn1Clicked()
{
Console.WriteLine("Do button click task");
}
public abstract void OnNotify();
}
public class Observer1 : AbsObserver
{
public Observer1(Subject subject)
: base(subject)
{
}
public override void OnNotify()
{
Console.WriteLine("observer1 notified");
}
}
public class Observer2 : AbsObserver
{
public Observer2(Subject subject)
: base(subject)
{
}
public override void OnNotify()
{
Console.WriteLine("observer2 notified");
}
}
public class Subject
{
private event Action Notify;
public void Attach(Action a)
{
Notify += a;
}
private void NotifyAll()
{
Notify();
}
}
这里的形式不是观察者。观察者具有形式的对象,所有形式相关的问题都由观察者处理。这是一种堆肥。
答案 3 :(得分:0)
简答:看看这个问题的第一个答案:Super-simple example of C# observer/observable with delegates
我理解你想尝试自己实现它,但委托和事件在这里真的很合适(实际上是c#内置的观察者模式的实现)。
如果仍然想自己做,我建议使用接口而不是抽象/具体类。
public interface ISubject
{
void AttachObserver(IObserver observer);
void DetachObserver(IObserver observer);
void NotifyObservers(CommonNotification Notification);
}
public interface IObserver
{
void OnNotify(CommonNotification Notification);
}
然后,您的表单可以实现IObserver(或ISubject或两者!!)。
public class MyForm : Form, IObserver
{
...
}