2020년 7월 8일 수요일

GOF Design Pattern - Mediator








설명


객체들의 상호작용이 복잡할 때 Mediator 로 상호작용을 몰아 넣음.

다대다의 관계가 일대다의 관계가 되는 것.

문제는 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
//서로 상호작용이 큰 위젯과 산하 클래스들
class Widget
{
public:
    Widget(class DialogDirector* d) : _director(d) {}
    void Changed() { _director->WidgetChanged(this); }
 
private:
    DialogDirector* _director;
};
 
class ListBox : public Widget
{
public:
    ListBox(class DialogDirector* d) : _director(d) {}
 
private:
    DialogDirector* _director;
};
 
class EntryField : public Widget
{
public:
    EntryField(class DialogDirector* d) : _director(d) {}
 
private:
    DialogDirector* _director;
};
 
class Button : public Widget
{
public:
    Button(class DialogDirector* d) : _director(d) {}
private:
    DialogDirector* _director;
};
 
cs

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
// 그것들을 관리하는 Directory
class DialogDirector
{
public:
    virtual ~DialogDirector();
 
    virtual void WidgetChanged(Widget*= 0;
 
private:
    DialogDirector();
    virtual void CreateWidgets() = 0;
};
 
 
class FontDialogDirector : public DialogDirector
{
public:
    FontDialogDirector();
    virtual ~FontDialogDirector();
    virtual void WidgetChanged(Widget* w)
    {
        if (w == _fontList) {}
        else if (w == _ok){}
        else if (w == _cancel){}
    }
 
protected:
    virtual void CreateWidgets()
    {
        _ok = new Button(this);
        _cancel = new Button(this);
        _fontList = new ListBox(this);
        _fontName = new EntryField(this);
    }
 
private:
    Button* _ok;
    Button* _cancel;
    ListBox* _fontList;
    EntryField* _fontName;
};
 
cs

Button, ListBox, EntryField 는 서로 상호작용이 많은 클래스의 예임.

각 구성 클래스들이 Director 주소를 가지고 있다는 것에 주의.

각 구성 클래스들이 자신이 수정된 뒤 부모 클래스인 Widget 클래스의 Changed 를 호출할 것임.  

그 Changed() 함수에 인자가 자기 자신이 들어간다는 점에 주의.

그걸 DialogDirector 가 WidgetChanged() 함수에서 보이는 것처럼 상호작용을 통제함. 




추가 설명

 
Facad 와 다른 점은 그것은 구성 클래스들을 모아서 하나의 인터페이스를 만든다는 것이고, 

Mediator 는 독립된 하나의 클래스가 있어서 구성 클래스들이 바뀔 때마다 자신이 바뀌었음을 알리고 뒤처리를 맡기는 거임.

그러니까 Facad 의 구성 클래스는 부모 클래스를 모르는데, Mediator 은 양방향으로 소통이 된다는 것.


감시자 패턴을 이용해서 소통을 구현하기도 함.



댓글 없음:

댓글 쓰기

List