중재자 패턴(Mediator): 중재자 개체를 사용하여 일련의 개체 상호 작용을 캡슐화합니다. 중재자는 객체가 서로를 명시적으로 참조할 필요를 없애므로 결합을 느슨하게 하고 상호 작용을 독립적으로 변경할 수 있습니다.
네 가지 역할:
추상 중재자 Mediator
구체 중재자 개체 ConcreteMediator
추상 클래스 Abstract
구체 추상 클래스 ConcreteAbstract
Mediator 패턴의 장점:
Mediator의 출현으로 각 Abstract의 결합이 줄어들어 각 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 중국어 홈페이지(www.php.cn)로!