メディエーター パターン (メディエーター): メディエーター オブジェクトを使用して、一連のオブジェクトの対話をカプセル化します。メディエータを使用すると、オブジェクトが相互に明示的に参照する必要がなくなるため、結合が緩和され、相互作用を独立して変更できるようになります。
4 つの役割:
抽象メディエーターMediator
具象メディエーター オブジェクト ConcreteMediator
抽象クラス Abstract
具象抽象クラス ConcreteAbstract
メディエーター パターンの利点:
Mediator の出現により、各 Abstract の結合が減少し、それぞれが抽象クラスとMediator は個別に変更して再利用できます。
オブジェクトがどのように連携するかが抽象化されているため、仲介物は独立した概念として扱われ、オブジェクトにカプセル化されます。このようにして、注意の焦点はオブジェクト自体の動作からオブジェクト間の相互作用に移されます。 、駅 より客観的な視点からシステムを見てください。
メディエーター モデルの欠点:
ConcreteMediator は集中化を制御するため、対話の複雑さはメディエーターの複雑さになり、メディエーターの責任がどの ConcreteAbstract よりも重くなります。
パターン実装:
[code]//前向声明 class Abstract; //中介者抽象类 class Mediator{ public: virtual void Send(std::string message, Abstract *abstract){} }; //抽象类 class Abstract{ protected: Mediator *mediator; public: //构造中介者 Abstract(Mediator *mediator){ this->mediator = mediator; } }; //具体抽象类1 class ConcreteAbstract1: public Abstract{ public: ConcreteAbstract1(Mediator *me):Abstract(me){} void Send(std::string message){ //中介者送出去 mediator->Send(message, this); } void Notify(std::string message){ std::cout << "ConcreteAbstract1 receive message: " << message << " ---(From ConcreteAbstract2)" << std::endl; } }; //具体抽象类2 class ConcreteAbstract2: public Abstract{ public: ConcreteAbstract2(Mediator *me):Abstract(me){} void Send(std::string message){ //中介者送出去 mediator->Send(message, this); } void Notify(std::string message){ std::cout << "ConcreteAbstract2 receive message: " << message << " ---(From ConcreteAbstract1)" << std::endl; } }; //具体中介者 class ConcreteMediator: public Mediator{ private: //需了解所存的具体抽象类对象 ConcreteAbstract1 *CA1; ConcreteAbstract2 *CA2; public: ConcreteMediator(){} void setConcreteMediator(ConcreteAbstract1 *CA1, ConcreteAbstract2 *CA2){ this->CA1 = CA1; this->CA2 = CA2; } virtual void Send(std::string message, Abstract *abstract){ if(abstract == CA1) CA2->Notify(message); else CA1->Notify(message); } };
クライアント:
[code]//Client int main(){ ConcreteMediator *m = new ConcreteMediator; //具体的抽象这认识具体的中介者 ConcreteAbstract1 *ca1 = new ConcreteAbstract1(m); ConcreteAbstract2 *ca2 = new ConcreteAbstract2(m); //让中介者认识两个具体的抽象类 m->setConcreteMediator(ca1, ca2); ca1->Send("Hello"); //Output: ConcreteAbstract2 receive message: Hello ---(From ConcreteAbstract1) ca2->Send("Hi"); //Output: ConcreteAbstract1 receive message: Hi ---(From ConcreteAbstract2) if(m != NULL){ delete m; m = NULL; } if(ca1 != NULL){ delete ca1; ca1 = NULL; } if(ca2 != NULL){ delete ca2; ca2 = NULL; } return 0; }
上記は、C++ デザイン パターンの中間パターンの簡単な紹介の内容です。さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) を参照してください。 !