2015-04-07 2 views
0

Здесь мы имеем свою реализацию медиатор шаблона проектирования Mediator umlПосредника шаблон проектирования в качестве тестовой системы

Цель состоит в том, чтобы создать рабочий/полезный экземпляр шаблона Mediator, код работает отлично. Вопрос в том, что это правильное использование шаблона, и было ли оно выполнено правильно?

ответ

0

Я использую посредник очень часто, но в C++ в qt. Однако я ничего не имею в виду. Поэтому я могу кое-что рассказать вам.

Я думаю, что ваш пример хорош. Generaly соединение, как внешний вид, как

объекта ---> Посредник ----> Объект

Посредник должен наследовать форму Abstrac посреднику. Посредник Abstrac обеспечивает интерфейс. Медиатор также должен иметь вектор или список всех объектов (указатель), которые хотят отправлять и получать данные в виде. Я хочу показать свой файл заголовка у моего посредника.

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 

Как вы видите, вам также необходимо создать объект класса. Объект - это класс sepcjal, предоставляющий интерфейс для конкретного объекта, каждый из которых хочет присоединиться к списку медиаторов. Этот патерн очень хорошо работает.

Я также представил GlobalMEdiator. Это нечто похожее на сеть. Посредник - это как LAN, а GlobalMediator - как WAN. В вашем примере GlobalMediator работал, если локальный посредник не нашел объект. Затем локальный посредник отправляет сообщение GlobalMediator, и он отправляет сообщение всем LocalMediator, которые у него есть в своем списке. Пусть говорят, что у A_Local_Mediator есть все ученики и преподаватели в одном классе. B_Local_Mediator имеют всех учеников и учителей в классе B. Когда преподаватель формирует класс A, который хочет отправить информацию студенту из calss, B mesage маршрутизируется. В этом коде GlobalMediator не реализован полностью, как вы видите. Если вы хотите, чтобы я это предоставил. В этот момент я нашел единственную концепцию.

TeacherA ---> A_Local_Mediator (если найти студента отправить в электронном письме студента в этом же Calss, если не ---> Global_ Посредник ----> B_Local_Mediator (найти студент)

Для чего это? В этом случае у вас есть очень простой механизм управления медиатором и объектом. Генерация в небольшом проекте GlobalMediator не требуется. Поэтому вы можете прокомментировать эти несколько строк.

Смежные вопросы