미디에이터 패턴이란

 

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가 복잡해짐

 

 

 

 

 

 

※ 참고 문헌

https://bloodstrawberry.tistory.com/1405