-
중재자 패턴@ 16. 1 ~ 17. 1/디자인 패턴 2016. 2. 1. 20:41
정의
다수의 객체를 다뤄야 하는 경우 주로 사용한다. 서로 관련된 객체를 복잡한 연관 관계를 한 곳으로 집중시키고자 하는 경우 이 객체들간의 “중재자”가 되어 그들이 서로를 알지 못하더라도 다른 객체에게 정보를 전달할 수 있다.장점중재자 클래스를 사용함으로써 각 클래스를 정의할 때 다른 객체를 참조할 필요 없이 중재자만 참조.여러 객체들에게 분산될 행위를 한 곳으로 모아 객체간의 결합도를 낮춘다.M:N의 관계를 M:1의 관계로 바꿔주어 관리, 확장, 재사용성이 높아진다.객체들간의 상호 연관 관계를 중재자에서 구현함으로써 객체의 행위와 무관하게 객체간의 관계를 다룰 수 있다.단점객체들 간의 모든 연관 관계를 집중하기 때문에 규모가 커지고 복잡해질 수 있다.클래스 다이어그램
학원에서 작성한 중재자 패턴은 user가 멤버변수로 Mediator를 가지고 있는 형태가 아니라 아무곳에서나 부를 수 있는 싱글톤으로 구현되어 있다.
예제 코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899#include <iostream>#include <list>#include <string>using namespace std;class User;//< 중재자 클래스class Mediator{public:virtual void appendUser(User* user) = 0;virtual void removeUser(User* user) = 0;virtual void sendMessage(const string message, User* sender) = 0;};//< 유저 클래스class User{public:User(string name, Mediator* medi) : m_UserName(name), m_pMediator(medi){ }public://< 다른 유저에게 메시지 전송void sendMessage(const string msg){//< 확인용 출력cout<<"보내는 유저 = "<<m_UserName<<endl;cout<<"보낸 메시지 = "<<msg<<endl;//< 중재자에게 메시지와 this 전송m_pMediator->sendMessage(msg, this);}void rcvMessage(const string msg){//< 확인용 출력cout<<"받는 유저 = "<<m_UserName<<endl;cout<<"받은 메시지 = "<<msg<<endl;}private://< 유저 이름string m_UserName;//< 중재자 포인터Mediator* m_pMediator;};//< 채팅 중재자class chatMediator : public Mediator{public://< 유저 등록virtual void appendUser(User* user) final{m_list.push_back(user);}virtual void removeUser(User* user) final{m_list.remove(user);}//< 다른 유저에게 메시지 전송virtual void sendMessage(const string message, User* sender) final{for (User* object : m_list){if (object != sender){object->rcvMessage(message);}}}private://< 유저 리스트list<User*> m_list;};void main(){chatMediator tempChat;User user1("Onodera",&tempChat);User user2("Popura", &tempChat);User user3("Minhyuk", &tempChat);tempChat.appendUser(&user1);tempChat.appendUser(&user2);tempChat.appendUser(&user3);user1.sendMessage("오빠 오늘 사냥하러 어디갈까요?");cout<<"-------------------------------------------------------------"<<endl;user3.sendMessage("비취숲에서 퀘스트 하러 갈까?");cout<<"-------------------------------------------------------------"<<endl;user2.sendMessage("퀘 지겨워요!! 그냥 인던 큐 잡고 낚시 ㄱ ㄱ");}cs '@ 16. 1 ~ 17. 1 > 디자인 패턴' 카테고리의 다른 글
객체 풀 (0) 2016.12.26 컴퍼넌트 패턴 & 이벤트 큐 정리 (0) 2016.12.26 심플팩토리 패턴 -> 팩토리 메소드 패턴 이야기 (0) 2015.02.01