>  기사  >  백엔드 개발  >  C++ 디자인 패턴의 중재자 패턴에 대한 간략한 소개

C++ 디자인 패턴의 중재자 패턴에 대한 간략한 소개

黄舟
黄舟원래의
2017-01-17 13:41:031328검색

중재자 패턴(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)로!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.