미디에이터 패턴이란 |
mediator : 중재자
객체간의 상호작용을 캡슐화하여 복잡한 통신과 제어를 한곳으로 집중시키는 패턴
객체간에 직접 통신하는 것이 아닌 중개자를 통해 통신하게 하여 객체간 결합도를 낮춤
예를들어 User 1 ~ 4가 채팅을 할 때 각각의 User가 통신하는 것이 아닌
Mediator(채팅방)에게 메세지를 보내고, 채팅방은 적절한 User가 받을 수 있게 중재하는 것
미디에이터 패턴 구조 |
1) Mediator
- 중재자
- 객체들간의 상호작용을 관리하고 조정하는 주체
- 요청을 받고 적절한 객체에 전달해줌
2) Colleague
- 중재자를 통해 상호작용하는 객체
- 다른 Colleague와 직접 통신하지 않음
미디에이터 패턴 구현 |
#include <iostream>
#include <vector>
using namespace std;
class Participant;
/*
Mediator Interface
인터페이스에 메세지(msg)와 보낸사람(participant) 매개변수를 받는 send함수 작성
*/
class ChatRoomMediator
{
public:
virtual void send(const string& msg, Participant* participant) = 0;
};
/*
Colleague Interface
누가 어떤 채팅방에 참가하는지 알아야 하므로 유저이름(name)과 채팅방이름/중재자(mediator)를
생성자의 매개변수로 받음
*/
class Participant
{
protected:
string name;
ChatRoomMediator* mediator;
public:
Participant(const string& name, ChatRoomMediator* mediator) : name(name), mediator(mediator) {}
void send(const string& msg) { mediator->send(msg + " from [" + name + "]", this); }
virtual void receive(const string& msg) = 0;
};
/*
Concrete Mediator
인터페이스로 제공된 send함수를 구현하고
누가 메세지를 받을지 구현함
*/
class ChatRoom : public ChatRoomMediator
{
private:
vector<Participant*> participants;
public:
void addParticipant(Participant* participant) { participants.push_back(participant); }
void send(const string& msg, Participant* sender) override
{
for (Participant* participant : participants)
{
if (participant != sender)
participant->receive(msg);
}
}
};
class User : public Participant // ConcreteColleague
{
public:
User(const string& name, ChatRoomMediator* mediator) : Participant(name, mediator) {}
void receive(const string& msg) override { cout << name << " is Received : " << msg << endl; }
};
int main()
{
ChatRoom* chatRoom = new ChatRoom();
User* user1 = new User("User1", chatRoom);
User* user2 = new User("User2", chatRoom);
User* user3 = new User("User3", chatRoom);
User* user4 = new User("User4", chatRoom);
chatRoom->addParticipant(user1);
chatRoom->addParticipant(user2);
chatRoom->addParticipant(user3);
chatRoom->addParticipant(user4);
cout << "User1 send message." << endl;
user1->send("Hello, everyone!"); cout << endl;
cout << "User2 send message." << endl;
user2->send("Hi, User1!"); cout << endl;
cout << "User3 send message." << endl;
user3->send("Hey there!"); cout << endl;
cout << "User4 send message." << endl;
user4->send("My Name is User4"); cout << endl;
return 0;
}
장단점 |
1) 장점
- 단일 책임 원칙과 개방폐쇄원칙 준수
- Colleague간의 결합도를 줄이므로 개별 Colleague들을 쉽게 재사용할 수 있음
2) 단점
- Mediator를 통해 간접적으로 통신하므로 오버헤드가 생길 수 있고, 프로젝트가 커질수록 Mediator가 복잡해짐
※ 참고 문헌