【问题标题】:Events vs Observer pattern事件与观察者模式
【发布时间】:2018-05-22 08:47:54
【问题描述】:

假设:我们有一个感兴趣的对象和多个对该对象感兴趣的对象(例如它的状态)。当感兴趣的对象以某种方式发生变化时,其他人想知道它。

第一种方法

这看起来像是观察者模式解决的经典问题。当感兴趣的对象发生变化时,它会调用订阅事件的对象上的方法。很简单。

第二种方法

在感兴趣的对象中定义一个事件,在更改时,引发此事件。其他人会监听这个事件并调用他们的方法。

一个明显的区别是对象调用方法不同。但是,为什么我们应该使用一种方法而不是另一种方法呢?

我知道这些概念,但我希望深入了解一个问题。

感谢任何提示!

【问题讨论】:

  • 观察者模式可以很好地跨网络远程调用方法,这是理想的用例,虽然事件更适合进程内执行,但它们不能跨网络
  • 两者之间大致没有区别,因为当您“引发此事件”时,您所做的就是通知所有观察者并调用他们的方法来告诉他们该事件。与复杂的基于事件的系统的唯一区别可能是可能涉及分发事件和处理观察者注册的第 3 方。但它本质上仍然是一种观察者模式
  • 堆栈溢出不是讨论模式优缺点的地方。

标签: java c# oop events design-patterns


【解决方案1】:

自从提出这个问题后,关于这个话题的想法很少:

我发现这个问题是基于意见的,但是这两种方法都有一些优点和缺点:

在我看来,基于事件的方法更容易实现:

public class Observable
{
    public event Action<object, object> OnStateChange;

    public void Event()
    {
        // do something
        // choose appropritate args
        OnStateChange.Invoke(null, null);
    }

    /* versus ************************************************/
    Observator[] observators;
    public void InformObservators()
    {
        foreach (Observator observator in observators)
            // choose appropritate args
            observator.UpdateState(null, null);
    }
}

public class Observator
{
    public Observator(Observable observable)
    {
        observable.OnStateChange += UpdateState;
    }
    /* versus ************************************************/
    public void UpdateState(object arg1, object arg2)
    {

    }
}

正如我们所见,Observator 模式在两种方法中差别不大,但Observable 类将有更简单的方法来通知更改,即Event 方法,我认为这比@ 更容易维护第二种方法的987654325@。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2021-04-04
    • 2014-10-14
    • 2019-11-23
    • 2016-02-20
    • 2023-04-10
    • 1970-01-01
    • 2022-12-14
    相关资源
    最近更新 更多