설명
객체들의 상호작용이 복잡할 때 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 은 양방향으로 소통이 된다는 것.
감시자 패턴을 이용해서 소통을 구현하기도 함.
댓글 없음:
댓글 쓰기