当前位置: 首页 > 知识库问答 >
问题:

通用观测器模式

欧阳嘉年
2023-03-14

我正在处理代码,其中有很多观察者模式实现。所有这些活动的组织方式如下:

观察者要实现的一些接口:

class ObserverInterface {
  virtual void FooOccurs() = 0;
};

实现注册、注销和通知的类:

class ObservableImpl {
  public:
    Register(ObserverInterface *observer);
    Unregister(ObserverInterface *observer);

  private:
    void SomeMethod() {
      // foo things
      for(auto &observer: observers) {
        observer.FooOccurs();
      }
    }
};

共有1个答案

曾新
2023-03-14

在C++11中,我建议使用基于令牌的方法。

你注册一个观察者。观察者只是一个std::function

注册函数返回一个令牌std::shared_ptr 。只要返回的shared_ptr有效,广播器就会继续向该监听器广播。

侦听器现在负责维护std::shared_ptr生存期。

在广播器内部,您在广播之前持有weak_ptr.lock()。如果我真的不需要注销(通常我不需要),我会懒洋洋地清理我的weak_ptr列表。否则,返回的shared_ptr有一个删除函数执行取消注册。

或者,您的侦听器是shared_ptr > ion,您在内部将weak_ptr存储到该侦听器。

在这个模型中,您不能轻易地注入一个UnregistraTon函数。但是,这确实意味着他们可以使用别名构造函数自己来将回调的生存期紧密绑定到他们自己,假设他们是由shared_ptr管理的。

根据我的经验,只需让侦听器维护std::vector 就足够了。如果他们有一个更复杂的监听关系,他们可以做更多的工作,维护键等。

混合动力车型也是可以的。

对于非线程安全广播来说,这两种方法都是可以接受的,并且可以用几十行代码编写。

线程安全广播变得棘手。通常,我发现您最好使用消息传递模式,而不是替代模式,因为这会稍微降低并发推理的难度。

这也不能处理这样的情况,即你想随时注册听众,广播者和听众的生命周期就像爆米花一样。

 类似资料:
  • 我想知道用模板observer配置的observer模式是否比常规observer模式更方便。模板观察者的概念是一个可观察的类,它具有配置为模板的特定观察者类型。作为一个例子,我将展示一个普通的观察者,并将其与模板观察者进行比较。 正常观察者模式 正常观察者界面: 对于实现NormalObserver接口的每个类,更新函数都是相同的。如果要实现特定的观察者,例如具有不同更新参数的观察者,这会导致问

  • 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力。当对象们连接在一起时,它们就可以相互提供服务和信息。 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信。但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改。也许,你只想根据你的具体应用环境而改进通信代码。或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属。 问题 当一个对象的状态

  • 通知 - Notification 不要把这里的通知和推送通知或者本地通知搞混了,这里的通知是基于订阅-发布模型的,即一个对象 (发布者) 向其他对象 (订阅者) 发送消息。发布者永远不需要知道订阅者的任何数据。 Apple 对于通知的使用很频繁,比如当键盘弹出或者收起的时候,系统会分别发送 UIKeyboardWillShowNotification/UIKeyboardWillHideNoti

  • 如何使用外观模式 现在我们用 PersistencyManager 来管理专辑数据,用 HTTPClient 来处理网络请求,项目中的其他类不应该知道这个逻辑。他们只需要知道 LibraryAPI 这个“外观”就可以了。 为了实现外观模式,应该只让 LibraryAPI 持有 PersistencyManager 和 HTTPClient 的实例,然后 LibraryAPI 暴露一个简单的接口给其

  • 英文原文:http://emberjs.com/guides/object-model/observers/ Ember 为包括计算后属性在内的任意一种属性提供了观察器。可以通过使用 addObserver 方法来为一个对象设置一个观察器: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Person = Ember.Obj

  • 主要内容:介绍,实现,Shape.java,Rectangle.java,Square.java,Circle.java,ShapeMaker.java,FacadePatternDemo.java外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。 介绍 意图:为子系统中的