观察者模式、订阅者发布者模式、vtk中的观察者模式

文章目录

什么是观察者模式

用于在对象之间建立一对多的依赖关系,当一个对象的状态发生变化时,其所依赖的所有对象都会收到通知并自动更新。

vtk是如何实现的观察者模式.AddObserver

在VTK(Visualization Toolkit)中,观察者模式通过AddObserver方法来实现。AddObserver方法允许一个对象(观察者)注册自己以便接收另一个对象(被观察者)的通知。被观察者对象在发生特定事件或状态变化时会调用已注册的观察者的相应方法,以便进行相应的处理或更新。

cpp 复制代码
#include <vtkSmartPointer.h>
#include <vtkObject.h>
#include <vtkCommand.h>
#include <iostream>

// 自定义观察者类
class CustomObserver : public vtkCommand
{
public:
  static CustomObserver* New()
  {
    return new CustomObserver;
  }

  virtual void Execute(vtkObject* caller, unsigned long eventId, void* callData)
  {
    if (caller)
    {
      std::cout << "Received event: " << caller->GetClassName() << ", Event ID: " << eventId << std::endl;
    }
  }
};

int main()
{
  // 创建一个被观察者对象
  vtkSmartPointer<vtkObject> observedObject = vtkSmartPointer<vtkObject>::New();

  // 创建一个观察者对象
  vtkSmartPointer<CustomObserver> observer = vtkSmartPointer<CustomObserver>::New();

  // 注册观察者对象到被观察者对象
  observedObject->AddObserver(vtkCommand::AnyEvent, observer);

  // 触发事件,通知观察者对象
  observedObject->InvokeEvent(vtkCommand::ModifiedEvent);

  return 0;
}
/*
我们首先创建了一个被观察者对象observedObject和一个自定义的观察者类CustomObserver。然后,使用AddObserver方法将观察者对象observer注册到被观察者对象上,通过指定事件ID(vtkCommand::AnyEvent表示任何事件)和观察者对象来建立它们之间的关联。最后,我们调用InvokeEvent方法来触发事件并通知观察者对象。当事件被触发时,执行观察者类中的Execute方法,打印出相关信息。
*/

什么时候使用观察者模式?什么使用订阅发布者模式?

  • 使用观察者模式的情况包括:

1.当一个对象的改变需要同时影响其他多个对象,并且不希望显式地指定这些对象时,可以使用观察者模式。

2.当一个对象的改变需要通知其他对象,但是不需要知道具体的接收者时,可以使用观察者模式。

3.当一个对象需要在改变时通知一组对象而无需知道具体对象时,可以使用观察者模式。

订阅发布者模式定义了一种一对多的依赖关系,允许多个订阅者(观察者)订阅一个发布者(被观察者),并在发布者状态改变时接收通知。与观察者模式不同的是,发布者和订阅者之间没有直接的依赖关系,它们通过消息队列、事件中心或者代理来进行通信。

  • 使用订阅发布者模式的情况包括:

当存在多个发布者和订阅者之间的松散关系时,可以使用订阅发布者模式。

当发布者和订阅者之间需要解耦,以便灵活地添加或移除发布者和订阅者时,可以使用订阅发布者模式。

当需要支持多对多的关系,即一个发布者可以有多个订阅者,一个订阅者也可以订阅多个发布者时,可以使用订阅发布者模式。

观察者模式的实现

to do ...

订阅发布者的实现

to do ...

总结

观察者模式中,观察者与被观察者有着密切的联系,耦合度高;

为了解决这个问题,程序员们发明了订阅者发布者模式,在这个模式下,

订阅者与发布者没有直接关系,大大的降低了耦合。

上面是我自己简单的见解,下面来看看高级玩家是如何描述的:

观察者模式(Observer Pattern)是一种行为型设计模式,其中存在一个被观察者(也称为主题或可观察者)和多个观察者之间的关系。当被观察者的状态发生变化时,它会通知所有观察者,并调用相应的方法来处理这些变化。这种模式中,被观察者和观察者之间是直接关联的,因此耦合度较高。
订阅者-发布者模式(Pub-Sub Pattern)是一种消息传递模式,其中存在一个发布者和多个订阅者之间的关系。发布者负责发送消息,而订阅者则订阅感兴趣的消息并进行处理。在这种模式中,发布者和订阅者之间没有直接的关联,它们通过消息队列、事件总线等机制进行通信,从而降低了耦合度。
下面是观察者模式和订阅者-发布者模式的一些关键区别:
1.关系类型:观察者模式是一种对象之间的一对多关系,即一个被观察者可以有多个观察者。而订阅者-发布者模式是一种消息传递机制,发布者和订阅者之间没有直接关联。
2.耦合度:观察者模式中,被观察者需要维护一个观察者列表,并将通知直接发送给观察者。这导致了较高的耦合度。而在订阅者-发布者模式中,发布者不需要知道谁订阅了它的消息,也无需维护订阅者列表,只需将消息发布到消息队列或事件总线中即可。
3.灵活性:由于观察者模式中被观察者和观察者之间的直接联系,可能会导致紧密耦合的设计。而在订阅者-发布者模式中,发布者和订阅者之间解耦,发布者和订阅者的数量和类型可以更加灵活地变化。
总的来说,订阅者-发布者模式通过引入一个中介(如消息队列、事件总线)来降低组件之间的耦合度,使系统更加灵活和可扩展。这种模式在处理大规模分布式系统、异步通信等方面非常有用。然而,在某些情况下,观察者模式仍然是一个简单而有效的解决方案,特别是当只需要维护少量对象之间的关系时。

相关推荐
小小寂寞的城10 小时前
JAVA观察者模式demo【设计模式系列】
java·观察者模式·设计模式
DKPT16 小时前
Java设计模式之行为型模式(责任链模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
OpenC++9 天前
【C++】观察者模式
c++·观察者模式·设计模式
charlie11451419120 天前
从C++编程入手设计模式——观察者模式
c++·观察者模式·设计模式
code bean23 天前
【设计模式】用观察者模式对比事件订阅(相机举例)
观察者模式·设计模式·c#
qqxhb1 个月前
零基础设计模式——行为型模式 - 观察者模式
java·观察者模式·设计模式·go
smallluan1 个月前
JS设计模式(4):观察者模式
javascript·观察者模式·设计模式
季鸢1 个月前
Java设计模式之观察者模式详解
java·观察者模式·设计模式
magic 2451 个月前
Java设计模式之观察者模式详解
观察者模式·设计模式
master-dragon1 个月前
设计模式-观察者模式
java·观察者模式·设计模式