ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 중재자 패턴
    @ 16. 1 ~ 17. 1/디자인 패턴 2016. 2. 1. 20:41

    정의

    다수의 객체를 다뤄야 하는 경우 주로 사용한다. 서로 관련된 객체를 복잡한 연관 관계를 한 곳으로 집중시키고자 하는 경우 이 객체들간의 “중재자”가 되어 그들이 서로를 알지 못하더라도 다른 객체에게 정보를 전달할 수 있다.


    장점
    중재자 클래스를 사용함으로써 각 클래스를 정의할 때 다른 객체를 참조할 필요 없이 중재자만 참조.
    여러 객체들에게 분산될 행위를 한 곳으로 모아 객체간의 결합도를 낮춘다.
    M:N의 관계를 M:1의 관계로 바꿔주어 관리, 확장, 재사용성이 높아진다.
    객체들간의 상호 연관 관계를 중재자에서 구현함으로써 객체의 행위와 무관하게 객체간의 관계를 다룰 수 있다.

    단점
    객체들 간의 모든 연관 관계를 집중하기 때문에 규모가 커지고 복잡해질 수 있다. 


    클래스 다이어그램


    학원에서 작성한 중재자 패턴은 user가 멤버변수로 Mediator를 가지고 있는 형태가 아니라 아무곳에서나 부를 수 있는 싱글톤으로 구현되어 있다.


    예제 코드

    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
Designed by Tistory.