0

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

我想在 C# 中实现一个观察者模式,所以任何观察者对象都可以订阅一个主题对象,然后接收它的所有通知。然后它根据通知类型决定它是否重要。

    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

4 回答 4

0

您可以像这样使用接口而不是抽象类

public Interface IObserver
{
    public void OnNotify(CommonNotification Notification);
}

....

public class MyForm:Form, IObserver {
....
}
于 2013-11-13T11:14:08.840 回答
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();
    }
}

这里形式不是观察者。观察者有表单的对象,所有与表单相关的问题都由观察者处理。这是一种堆肥。

于 2013-11-13T11:19:22.910 回答
0

你应该用一个接口替换你的观察者类:

public Interface IObserver
{
    public void OnNotify(CommonNotification Notification);
}

然后你的主窗体(或其他任何东西)可以实现 IObserver

于 2013-11-13T11:15:15.803 回答
0

简短答案:查看此问题的第一个答案:C# 观察者/可观察的超级简单示例与委托

我了解您想尝试自己实现它,但委托和事件在这里真的很自然(实际上是 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
{
...
}
于 2013-11-13T11:24:48.133 回答