C#中的观察者模式/如何使表单成为观察者

时间:2013-11-13 11:05:08

标签: c# design-patterns inheritance observer-pattern

到目前为止我找不到答案,可能只是缺少适当的搜索关键字。

我想在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()事件。

我在这里错过了什么?我知道我应该使用事件处理程序正确实现它,但为了了解基本设计模式是如何工作的,我首先要自己实现。

4 个答案:

答案 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
{
...
}