중재자 패턴

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