解耦两个类以进行通知

时间:2013-01-19 12:53:06

标签: c++ algorithm events poco

我只是盯着Poco框架。我有另一个基础框架已经使用Poco框架并抽象它的一些部分,使其更容易。

我想用一个简单的场景来解释这个问题:
考虑到我的程序中有一个矩形形状对象。形状内部有私有hit Testing方法,并且在特定时间内命中测试为真,我必须在另一个类中触发一个函数,即我的Fountain类。

我不需要将形状的任何特定对象信息传递给Fountation类中的函数。我的框架已经为我提供了NotifyEventAddListener的一些功能。如果我想通过这种方法,我会在我的形状类中有一个事件,它将在Add Listener(如果传递形状的对象)中通过喷泉订阅,并且事件从内部通知形状类。

现在,通过Poco通知中心,我不会将形状对象引用传递给基础类,而是将NotificationCenter引用传递给第二个类。 fountain类将有一个观察者,观察者将通过postNotification()
的形状通知 我在这两种方法之间看到的唯一区别是没有传递特定的对象信息。我在这里只是一个更新的开发人员,试图尽可能地学习良好的编码实践,并且不清楚这里的解耦。这两个类如何解耦? (因为我没有传递shape对象而只是使用notificationcenter对象?)

编辑:添加上述问题。我们说我还有其他10个类需要听某个通知,所以我还必须将Notification Center的引用传递给所有这些类吗?这样,我才能在我的课程中为通知中心添加观察者。

2 个答案:

答案 0 :(得分:1)

基本上是的。如果Fountain类仅知道NotificationCenter,则它不再与形状(Rectangle或其他)相关联。这假定形状发布的通知也不依赖于触发它的对象。

编辑:对您的修改的回复是肯定的,您需要使用需要通知的每个对象调用addObserver方法

答案 1 :(得分:1)

您应该做的是将消息发送和接收过程解耦为Observer - Listener结构。这称为观察者模式。您可以阅读有关此模式的更多详细信息here。这将使您免于处理多个引用和事件,以及每次需要将通信添加到另一个类时考虑消息发送/接收实现。

您可以在书籍Design Patterns. Elements of Reusable Object-Oriented Software中找到有关设计模式的更多信息。