这里我们实现了中介设计模式
目标是创建一个工作/有用的Mediator模式实例,代码工作正常。问题是这是对模式的恰当使用,是否正确执行?
答案 0 :(得分:0)
我经常使用中介,但在qt中使用c ++。不过我觉得这没关系。所以我可以告诉你一些事情。
我认为你的榜样很好。通常连接如
对象--->调解员---->对象
调解员应继承Abstrac Mediator的形式。 Abstrac中介提供界面。 Mediator也应该有向量或列出所有要发送的对象(指针)并获取数据beetwen as。我想从我的调解员那里显示我的头文件。
class Object;
class GlobalMediator;
class Mediator;
class IMediator
{
public:
virtual void Send(QString from , QString to, QString message) = 0;
virtual void Send(QString from , QString to, QString parametr , QString message) = 0;
virtual void Send(QString from , QString to , QGraphicsItem *item) = 0;
virtual void Send(QString from , QString to , QString message , QVector<QString> vect) = 0;
// virtual void SendFromOut(QString from , QString to, QString message) = 0;
};
class Mediator : public QObject , public IMediator
{
Q_OBJECT
private:
QMap<QString ,Object* > map;
GlobalMediator *gMed;
QString name;
public:
Mediator(QString name);
QString getName();
void Register(Object* obj);
void Unregister(QString name );
void setGlobalMediator(GlobalMediator *gm);
void Send(QString from , QString to, QString message);
void Send(QString from , QString to, QString parametr , QString message);
void Send(QString from , QString to , QGraphicsItem *item);
void Send(QString from , QString to , QString message , QVector<QString> vect);
};
class GlobalMediator
{
private:
QMap<QString , Mediator*> map;
public:
GlobalMediator();
void RegisterMediator(Mediator *med);
void UnregisterMediator(Mediator *med);
\
};
class Object
{
// Q_OBJECT
public:
Object(Mediator *medium , QString name);
Object(QString name);
private:
Mediator *medium;
protected:
QString name;
public: //others
void AddMediator(Mediator *med);
Mediator* getMediator();
QString _name();
public:
virtual void Send(QString to , QString message);
virtual void Send(QString to, QString parametr , QString message);
virtual void Send(QString to, QGraphicsItem *item);
virtual void Send(QString to , QString message , QVector<QString> vect);
virtual void Receive(QString from, QString message);
virtual void Receive(QString from, QString parametr , QString message);
virtual void Receive(QString from, QGraphicsItem *item);
virtual void Receive(QString from , QString message , QVector<QString> vect);
};
#endif // MEDIATOR_H
如您所见,您还需要创建类Object。对象是sepcjal类为concret对象提供的接口,每个whant都要加入到mediator列表中。这个模式非常有效。
我还介绍了GlobalMEdiator。这有点像网络简单介体有些像LAN,而GlobalMediator有点像WAN。在您的示例中,如果未找到Local mediator对象,则GlobalMediator会工作。然后,本地中介向GlobalMediator发送消息,并将消息发送给其列表中的每个LocalMediator。假设A_Local_Mediator让所有学生和老师都在一个班级。 B_Local_Mediator有B级的所有学生和老师。当老师形成A级时,要从calss B发送信息给学生发送信息。在此代码中,GlobalMediator没有完全实现,如您所见。如果你知道我可以提供这个。在这一刻,我找到了唯一相同的概念。
TeacherA ---&gt; A_Local_Mediator(如果找到学生发送消息到学生 在同样的情况下,如果不是---&gt; Global_ Mediator ----&gt; B_Local_Mediator (找学生)
这是什么???在这种情况下,您可以使用非常简单的机制来管理Mediator和Object。通常在小项目中不需要GlobalMediator。所以你可以评论这几行。