0

在此处输入图像描述

我必须设计一个实用程序类来实现不同对象之间的事件通信。每个类都应该从 util 派生以使用它提供的框架。在图中,限制就像 B 发布的内容只有 A 和 C 可以接收,而 X 和 Y 不能。它应该被限制在一个组或一个层中。当 X 只发布 B 而 y 可以接收时。但是在发布时,发布者不应该知道它是向谁发布的,而订阅者的情况也是如此。它不应该知道它是从谁那里订阅的。使用通用的发布者和订阅者方法,我可以将事件发送给任何订阅它的人,但我不能将它限制在一个组内。这里有两个组,如 ABC 和 BXY。同样,无论应该对实用程序进行什么更改,都不应更改除 util 之外的所有对象都实现的业务逻辑。

对 util 类中的逻辑有什么建议吗?

4

2 回答 2

1

看起来您的愿望是允许每个类的实例与它们派生的类以及它们的所有兄弟姐妹(从其父类派生的类)进行 pub/sub 通信。

这是一个非常特殊的需求,而特殊的需求通常需要有趣的解决方案。

一种解决方案是为每个父类创建一个 pub/sub 类。每个类都将自己与其父类和自己的类相关联(以便它可以分别与其兄弟姐妹和所有后代进行通信)。

template <typename T>
struct PubSubSingleston
{
     static PubSubManager instance;
}

template <typename T>
PubSubManager PubSubSingleton<T>::instance;

然后一个类可以将自己与那些发布-订阅“层”相关联。如果你支持的话,最干净的方法可能是多重继承

template <typename ClassT, typename ParentT>
class PubSubHelper
{
    public:
        PubSubHelper()
        {
            PubSubSingleton<ClassT>::instance.associate(this);
            PubSubSingleton<ParrentT>::instance.associate(this);
        }

        void publish(const Message& inMessage)
        {
            PubSubSingleton<ClassT>::instance.publish(inMessage);
        }
};

class X
: public B
, PubSubHelper<X, B>
{ ... }

还有许多其他模式(如 CRTP)可以使用它,但基本技术是将一个类与一些与其自身关联的 PubSub 对象相关联,另一个与它的父对象相关联。

于 2013-09-04T06:09:04.763 回答
0
typedef std::shadred_ptr<Child> ChildPtr;
//A and X inherit from Child

ChildPtr Util::AFactory()
{
    //In its constructor, A adds itself to its own subscribers set, 
    //which is really contained in Util
    return make_shared<A> (this->ASubscribersSetPtr);
}

ChildPtr Util::XFactory()
{
    //In its constructor, X adds itself to its own subscribers set, 
    //which is really contained in Util
    return make_shared<X> (this->XSubscribersSetPtr);
}

void Child::Publish()
{
    for(ChildPtr& indiv: SubscribersSetPtr)
    {
        if(indiv.get()!=this)
        {
            indiv->ReceiveMessage(this->message);
        }
    }
}       
于 2013-09-03T08:10:51.577 回答