중재자 패턴
2015. 5. 4. 18:19ㆍ프로그래밍/Design Patterns
728x90
728x90
정의
다수의 객체를 다뤄야 하는 경우 주로 사용한다. 서로 관련된 객체를 복잡한 연관 관계를 한 곳으로 집중시키고자 하는 경우 이 객체들간의 “중재자”가 되어 그들이 서로를 알지 못하더라도 다른 객체에게 정보를 전달할 수 있다.
장점
중재자 클래스를 사용함으로써 각 클래스를 정의할 때 다른 객체를 참조할 필요 없이 중재자만 참조.
여러 객체들에게 분산될 행위를 한 곳으로 모아 객체간의 결합도를 낮춘다.
M:N의 관계를 M:1의 관계로 바꿔주어 관리, 확장, 재사용성이 높아진다.
객체들간의 상호 연관 관계를 중재자에서 구현함으로써 객체의 행위와 무관하게 객체간의 관계를 다룰 수 있다.
단점
객체들 간의 모든 연관 관계를 집중하기 때문에 규모가 커지고 복잡해질 수 있다.
클래스 다이어그램
예제 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #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 |
결과
728x90
반응형
'프로그래밍 > Design Patterns' 카테고리의 다른 글
[Design Pattern] 싱글톤 (2) | 2016.02.15 |
---|---|
[Design Pattern] 팩토리 패턴 (2) | 2016.01.30 |
디자인 패턴 연관도 (1) | 2015.07.08 |
싱글톤 사용하기 (2) | 2015.04.21 |
[Design Pattern] 옵저버 패턴 개요 (0) | 2015.04.18 |
디자인 패턴, 싱글톤, 상태패턴 (2) | 2015.04.15 |