
Mediator を C++ で
Mediator は、 振る舞いに関するデザインパターンの一つで、 プログラムのコンポーネント間の通信を特別なメディエーター・オブジェクトを通して行うことで、 結合を疎にします。
Mediator により、 個々のコンポーネントは、 何十ものクラスへの依存がなくなるため、 変更、 拡張、 再利用が容易になります。
複雑度:
人気度:
使用例: C++ コードで Mediator パターンがよく使われるのは、 アプリの GUI コンポーネント間の通信のやりとりです。 Mediator は、 MVC パターンの C の部分、 Controller と同義語です。
概念的な例
この例は、 Mediator デザインパターンの構造を説明するためのものです。 以下の質問に答えることを目的としています:
- どういうクラスからできているか?
- それぞれのクラスの役割は?
- パターンの要素同士はどう関係しているのか?
main.cc: 概念的な例
#include <iostream> #include <string> /** * The Mediator interface declares a method used by components to notify the * mediator about various events. The Mediator may react to these events and * pass the execution to other components. */ class BaseComponent; class Mediator { public: virtual void Notify(BaseComponent *sender, std::string event) const = 0; }; /** * The Base Component provides the basic functionality of storing a mediator's * instance inside component objects. */ class BaseComponent { protected: Mediator *mediator_; public: BaseComponent(Mediator *mediator = nullptr) : mediator_(mediator) { } void set_mediator(Mediator *mediator) { this->mediator_ = mediator; } }; /** * Concrete Components implement various functionality. They don't depend on * other components. They also don't depend on any concrete mediator classes. */ class Component1 : public BaseComponent { public: void DoA() { std::cout << "Component 1 does A.\n"; this->mediator_->Notify(this, "A"); } void DoB() { std::cout << "Component 1 does B.\n"; this->mediator_->Notify(this, "B"); } }; class Component2 : public BaseComponent { public: void DoC() { std::cout << "Component 2 does C.\n"; this->mediator_->Notify(this, "C"); } void DoD() { std::cout << "Component 2 does D.\n"; this->mediator_->Notify(this, "D"); } }; /** * Concrete Mediators implement cooperative behavior by coordinating several * components. */ class ConcreteMediator : public Mediator { private: Component1 *component1_; Component2 *component2_; public: ConcreteMediator(Component1 *c1, Component2 *c2) : component1_(c1), component2_(c2) { this->component1_->set_mediator(this); this->component2_->set_mediator(this); } void Notify(BaseComponent *sender, std::string event) const override { if (event == "A") { std::cout << "Mediator reacts on A and triggers following operations:\n"; this->component2_->DoC(); } if (event == "D") { std::cout << "Mediator reacts on D and triggers following operations:\n"; this->component1_->DoB(); this->component2_->DoC(); } } }; /** * The client code. */ void ClientCode() { Component1 *c1 = new Component1; Component2 *c2 = new Component2; ConcreteMediator *mediator = new ConcreteMediator(c1, c2); std::cout << "Client triggers operation A.\n"; c1->DoA(); std::cout << "\n"; std::cout << "Client triggers operation D.\n"; c2->DoD(); delete c1; delete c2; delete mediator; } int main() { ClientCode(); return 0; }
Output.txt: 実行結果
Client triggers operation A. Component 1 does A. Mediator reacts on A and triggers following operations: Component 2 does C. Client triggers operation D. Component 2 does D. Mediator reacts on D and triggers following operations: Component 1 does B. Component 2 does C.