반응형
Mediator Pattern (중재자 패턴)
목적
각각의 객체들(colleague)끼리 서로를 직접 참조하지 않고 mediator(중재자)를 통해 메세지를 주고 받는다.
각각의 객체들은 서로에 대한 정보는 전혀 모르기 때문에 커플링이 느슨하게 한다.
사용 시나리오
- 스마트폰이 없던 시절 문자로 단체일정을 잡기 위해서는 아래의 그림과 같이 개개인에게 연락을 했어야 했다.
- 스마트폰의 등장이후로 단체톡방(Mediator)을 만들어서 메세지(일정)를 보내면 된다
[Mediator]
class Meditator {
public:
virtual ~Meditator() {}
void addColleague(Colleague* collegue) {
this->collegues.push_back(collegue);
}
virtual void mediate(string message) = 0;
protected:
list<Colleague*> collegues;
};
[ConcreteMediator]
class ChatMediator : public Meditator {
public:
virtual void mediate(string message) override {
list<Colleague*>::iterator iter;
for(iter = collegues.begin(); iter!=collegues.end(); ++iter)
{
(*iter)->handleMessage(message);
}
}
};
[Colleague]
class Colleague {
public:
virtual ~Colleague() {}
void setMeditator(Meditator* meditator) {
this->meditator = meditator;
this->meditator->addColleague(this);
}
void sendMessage(string message) {
cout<<"Colleague:"<<this<<" Send message"<<endl;
meditator->mediate(message);
}
virtual void handleMessage(string message) = 0;
private:
Meditator* meditator;
};
[ConcreteColleague]
class ChatColleague : public Colleague {
public:
virtual void handleMessage(string message) override {
cout<<message<<endl;
}
};
[Client]
int main(int argc, const char * argv[]) {
Meditator* chatMediator = new ChatMediator();
Colleague* colleague1 = new ChatColleague();
Colleague* colleague2 = new ChatColleague();
Colleague* colleague3 = new ChatColleague();
colleague1->setMeditator(chatMediator);
colleague2->setMeditator(chatMediator);
colleague3->setMeditator(chatMediator);
colleague1->sendMessage("hi_1");
colleague2->sendMessage("hi_2");
colleague3->sendMessage("hi_3");
delete colleague1;
delete colleague2;
delete colleague3;
delete chatMediator;
return 0;
}
실행결과
Colleague:0x100696570 Send message
hi_1
hi_1
hi_1
Colleague:0x100695950 Send message
hi_2
hi_2
hi_2
Colleague:0x1006954c0 Send message
hi_3
hi_3
hi_3
반응형
'Design Patterns > Behavioral Patterns' 카테고리의 다른 글
State Pattern (C++) (0) | 2020.01.03 |
---|---|
Memento Pattern (C++) (0) | 2019.12.30 |
Command Pattern (C++) (0) | 2019.12.22 |
Chain of Responsibility Pattern (C++) (0) | 2019.12.15 |
Behavior Pattern (행동 패턴) (0) | 2019.12.15 |