1.1. Intent ¶
MediatorPatternμ κ°μ²΄λ€μ μ΄λ μ§ν©λ€μ΄ interactionνλ λ°©λ²μ encapsulateνλ κ°μ²΄λ₯Ό μ μνλ€. Mediatorλ κ°μ²΄λ€μ μλ‘μκ² λͺ
μμ μΌλ‘ μ‘°ννλ κ²μ λ§μμΌλ‘μ loose couplingμ μ΄μ§νλ©°, κ·Έλμ Mediatorλ μ¬λ¬λΆμκ² κ°μ²΄λ€μ interactionsλ€μ΄ λ
립μ μΌλ‘ λ€μνκ² ν΄μ€λ€.
1.2. Motivation ¶
Object-Oriented λμμΈμ κ°μ²΄λ€ μ¬μ΄μ νμ λΆμ°μ μ₯λ €νλ€. κ·Έλ° λΆμ°μ κ°μ²΄λ€ μ¬μ΄μ λ§μ μ°κ΄μ μ§λ κ°μ²΄ κ΅¬μ‘°λ‘ λνλ μ μλ€. μ΅μ
μ κ²½μ°μλ λͺ¨λ κ°μ²΄κ° κ²°κ΅ λͺ¨λ λ€λ₯Έ κ°μ²΄λ€μ μκ² λλ€.
λΉλ‘ νλμ μμ€ν
μ λ§μ κ°μ²΄λ€μ΄ μ°Έμ¬νλ κ²μ΄ μΌλ°μ μΌλ‘ μ¬μ¬μ©μ±μ κ°νν μ§λΌλ interconnectionsμ΄ λμ΄λλ κ²μ μ¬μ¬μ©μ±μ κ°μμν€λ €λ κ²½ν₯μ΄ μλ€. λ무λ λ§μ κ°μ²΄κ°μ μνΈ μ°κ²°λ€μ κ°μ²΄λ€μ λ
립μ±μ λ¨μ΄λ¨λ¦΄ μ μλ€. - κ·Έλ° μμ€ν
μ λ§μΉ μμ ν ν΅μΌλ κ² κ°μ΄ νλνλ€.
κ²λ€κ° νλμ μμ€ν
μ λ§μ κ°μ²΄λ€μ΄ μ°Έμ¬νλ κ²μ μ΄λ€ μλ―Έμλ λ°©λ²μΌλ‘ μμ€ν
μ νμλ₯Ό λ°κΎΈλ κ²μ μ΄λ ΅κ² νλ€. μλνλ©΄, νμλ λ§μ κ°μ²΄λ€ μ¬μ΄λ‘ λΆμ°λμ΄ μ‘κΈ° λλ¬Έμ΄λ€. κ²°λ‘ μ μΌλ‘ λΉμ μ μλ§ κ·Έλ° μμ€ν
μ νμλ₯Ό customizeνκΈ° μν΄μ μλ§μ subclassλ€μ μ μν΄μΌ ν κ²μ΄λ€.
μλ‘μ¨ μ΄λ€ GUIμμμ λ€μ΄μΌλ‘κ·Έ λ°μ€μ ꡬνμ κ³ λ €ν΄λ³΄μ. νλμ λ€μ΄μΌλ‘κ·Έ λ°μ€λ μμ λꡬλ€(λ²νΌ, λ©λ΄, μ
λ ₯ νλ)μ λͺ¨μμ νννλ νλμ μλμ°λ₯Ό μ¬μ©νλ€.
λκ² λ€μ΄μΌλ‘κ·Έμ λκ΅¬λ€ μ¬μ΄μλ μ΄λ€ dependencyλ€μ΄ μ‘΄μ¬νλ€. μλ₯Ό λ€λ©΄, μ΄λ€ λ²νΌμ μ΄λ€ μ
λ ₯ νλκ° λΉμ΄μμλλ λΉνμ±ν λμ΄μλλ€. list boxλΌ λΆλ¦¬λ μ ν λͺ©λ‘μμ κ°μ²΄λ₯Ό μ ννλ κ²μ μ
λ ₯νλμ λ΄μ©μ λ°κΏ κ²μ΄λ€. λ°κΏλ§νλ©΄, μ
λ ₯νλμ λ¬Έμλ₯Ό νμ΄ννλ κ²μ μλμ μΌλ‘ 리μ€νΈ λ°μ€μμ νλμ΄μμ λμλλ μ
λ ₯μ μ ννλ κ²μ΄λ€. νλ² ν
μ€νΈκ° μ
λ ₯ νλμ λνλλ©΄, λ€λ₯Έ λ²νΌλ€μ μλ§ νμ±ν λ κ²μ΄λ€. κ·Έλμ μ¬μ©μκ° ν
μ€νΈλ‘ μ΄λ€ μΌμ νκ² νκ²ν κ²μ΄λ€. μλ₯Ό λ€μλ©΄, κ΄λ ¨μλ κ²μ μμ νκ±°λ λ³κ²½νκ±°λ νλ λ°μμ μΌμ ν μ μμ κ²μ΄λ€.
λ€λ₯Έ λ€μ΄μΌλ‘κ·Έ λ°μ€λ€μ λκ΅¬λ€ μ¬μ΄μμ λ€λ₯Έ dependencyλ€μ μ§λ κ²μ΄λ€. κ·Έλμ μ¬μ§μ΄ λ€μ΄μΌλ‘κ·Έλ€μ΄ λκ°μ μ’
λ₯μ λꡬλ€μ μ§λλ€ νλλΌλ, λ¨μν μ΄μ μ λꡬ ν΄λμ€λ€μ μ¬μ¬μ© ν μλ μλ€. dialog-specific dependencyλ€μ λ°μνκΈ° μν΄μ customizeλμ΄μ ΈμΌ νλ€. subclassingμ μν΄μ κ°λ³μ μΌλ‘ λꡬλ€μ Customizeνλ κ²μ μ§λ£¨ν κ²μ΄λ€. μλνλ©΄ λ§μ ν΄λμ€λ€μ΄ κ·Έλ κ² λμ΄μΌ νκΈ° λλ¬Έμ΄λ€.
λ³κ°μ mediator κ°μ²΄μμ μ§λ¨μ νμλ‘ encapsulateνλ κ²μ μν΄μ μ΄λ° λ¬Έμ λ₯Ό νΌν μ μλ€. νλμ mediatorλ κ°μ²΄λ€ κ·Έλ£Ή λ΄μ μνΈμμ©λ€μ μ μ΄νκ³ μ‘°μ ν μ±
μμ΄ μλ€. κ·Έ mediatorλ κ·Έλ£Ήλ΄μ κ°μ²΄λ€μ΄ λ€λ₯Έ κ°μ²΄λ€κ³Ό λͺ
μμ μΌλ‘ μ‘°ννλ κ²μ λ§λ μ€κ°μλ‘μμ μν μ νλ€. κ·Έλ° κ°μ²΄λ€μ λ¨μ§ mediatorλ§ μκ³ μκ³ , κ³ λ‘ interconnectionμ μλ μ€μ΄ λ€κ² λλ€.
μλ₯Ό λ€λ©΄, FontDialogDirectorλ λ€μ΄μΌλ‘κ·Έ λ°μ€μ λκ΅¬λ€ μ¬μ΄μ mediatorμΌ μ μλ€. FontDialogDirectorκ°μ²΄λ λ€μ΄μΌλ‘κ·Έ λꡬλ€μ μκ³ κ·Έλ€μ interactionμ μ‘°μ νλ€. κ·Έκ²μ λκ΅¬λ€ μ¬μ΄μ communicationμμ hubμ κ°μ μν μ νλ€.
λ€μ interaction diagramμ κ°μ²΄λ€μ΄ 리μ€νΈλ°μ€μ μ νμμ λ³νλ₯Ό λ€λ£¨κΈ° μν΄ νλνλ λ°©λ²μ λ¬μ¬νκ³ μλ€.
Here's the succession of events by which a list box's selection passes to an entry field.
μ¬κΈ°μλ list boxμμμ μ νμ΄ entry field λ‘ μ λ¬λκ³ μλ μ΄λ²€νΈλ€μ νλ¦μ΄ μλ€.
μ¬κΈ°μλ list boxμμμ μ νμ΄ entry field λ‘ μ λ¬λκ³ μλ μ΄λ²€νΈλ€μ νλ¦μ΄ μλ€.
- 리μ€νΈ λ°μ€κ° κ·Έκ²μ directorμκ² κ·Έκ²μ΄ λ³νλ€κ³ λ§νλ€.
- directorλ 리μ€νΈ λ°μ€λ‘ λΆν° μ νμ μ»λλ€.
- directorλ μ
λ ₯ νλλ‘ μ νμ λκΈ΄λ€.
- μ΄μ μ
λ ₯ νλλ μ΄λ€ λ¬Έμλ₯Ό ν¬ν¨νλ€. directorλ νλ(κΈμ¨λ₯Ό κ΅΅κ² νκ±°λ κΈ°μΈμ΄κ² νλ λ°μμ νλ)μ μ΄κΈ°νλ₯Ό μν΄ λ²νΌμ νμ±ν νλ€.
FontDialogDirector μΆμνκ° ν΄λμ€ libraryλ₯Ό ν΅ννλ λ°©λ²μ λ€μκ³Ό κ°λ€.
DialogDirectλ λ€μ΄μΌλ‘κ·Έμ μ 체 νμλ₯Ό μ μν μΆμ ν΄λμ€μ΄λ€. clientλ€μ νλ©΄μ λ€μ΄μΌλ‘κ·Έλ₯Ό λνλ΄κΈ° μν΄μ ShowDialog μ°μ°μλ₯Ό νΈμΆνλ€. CreateWidgetsλ λ€μ΄μΌλ‘κ·Έ λꡬλ€μ λ§λ€κΈ° μν μΆμ μ°μ°μμ΄λ€. WidgetChangedλ λ λ€λ₯Έ μΆμ μ°μ°μμ΄λ©°, λꡬλ€μ directorμκ² κ·Έλ€μ΄ λ³νλ€λ κ²μ μλ €μ£ΌκΈ° μν΄μ μ΄λ₯Ό νΈμΆνλ€. DialogDirector subclassλ€μ CreateWidgetsμ μ μ ν λꡬλ€μ λ§λ€κΈ° μν΄μ overrideνκ³ κ·Έλ¦¬κ³ κ·Έλ€μ WidgetChangedλ₯Ό λ³νλ₯Ό λ€λ£¨κΈ° μν΄μ overrideνλ€.
1.3. Applicability ¶
MediatorPatternμ μ΄λ΄ λ μ¬μ©νλ€.
- μ΄λ€ κ°μ²΄λ€μ μ§ν©μ΄ μ μ μλμμ§λ§, 볡μ‘ν λ°©λ²μΌλ‘ ν΅μ ν λ. interconnectionμ κ²°κ³Όλ ꡬ쑰νλμ§ λͺ»νκ³ μ΄ν΄λ₯Ό μ΄λ ΅κ² νλ€.
- μ΄λ€ κ°μ²΄λ₯Ό μ¬μ¬μ©νλ κ²μ΄ κ·Έκ²μ΄ λ§μ λ€λ₯Έ κ°μ²΄λ€κ³Ό κ΄λ ¨μ΄ μκ³ ν΅μ μ νκΈ° λλ¬Έμ μ΄λ €μΈ λ.
- λͺλͺμ ν΄λμ€λ€ μ¬μ΄μ λΆμ°λμ΄μ§ νλμ νμκ° λ§μ subclassingνλ μμ
μμ΄ customizeλμ΄μ ΈμΌ ν λ.
1.5. Participants ¶
- Mediator(DialogDirector)
Colleague κ°μ²΄λ€κ³Ό ν΅μ μ μν΄μ μΈν°νμ΄μ€λ₯Ό μ μνλ€.
- ConcreteMediator(FontDialogDirector)
Colleague κ°μ²΄λ€μ μ‘°μ ν¨μΌλ‘μ¨ μ½ν© νμλ₯Ό ꡬννλ€.
μμ μ colleagueλ€μ μκ³ κ΄λ¦¬νλ€.
- Colleague classes(listBox, Entry Field)
κ°κ°μ colleague classλ μμ μ Mediator κ°μ²΄λ₯Ό μλ€.
κ°κ°μ colleague λ μμ μ΄ λ€λ₯Έ colleagueμ ν΅μ ν λλ§λ€ μμ μ mediatorμ ν΅μ νλ€.
1.6. Collaborations ¶
Colleagueλ€μ Mediator κ°μ²΄μκ² μμ²μ 보λ΄κ³ λ°λλ€. Mediatorλ μ μ ν colleagueμκ² μμ²μ 보λμΌλ‘μ¨ νλ νμλ₯Ό ꡬννλ€.
1.7. Consequences ¶
Mediator Patternμ λ€μκ³Ό κ°μ μ₯μ κ³Ό λ¨μ μ μ§λλ€.
- MediatorPatternμ subclassingμ μ ννλ€. mediatorλ λ€μλ§ν΄ λͺλͺκ°μ κ°μ²΄λ€ μ¬μ΄μ λΆμ°λμ΄μ§ νμλ₯Ό μ§μ€νλ€. μ΄λ° νμλ₯Ό λ°κΎΈλ κ²μ λ¨μ§ Mediatorλ₯Ό subclassingνκΈ°λ§ νλ©΄ λλ€. Colleague ν΄λμ€λ€μ μ¬μ¬μ©λμ΄μ§ μ μλ€.
- MediatorPatternμ colleagueλ€μ λΌμ΄λλλ€. Mediatorλ colleagueλ€ μ¬μ΄μμ loose couplingμ μ΄μ§νλ€. colleaguedμ Mediatorλ₯Ό κ°λ³μ μΌλ‘ λ€μνκ² ν μ μκ³ , μ¬μ¬μ© ν μ μλ€.
- MediatorPatternμ κ°μ²΄ protocolsμ λ¨μν μν¨λ€. Mediatorλ λ€λλ€ μνΈκ΄κ³λ₯Ό Mediatorμ colleagueλ€ μ¬μ΄μ μΌλλ€ κ΄κ³λ‘ λ°κΎΈμ΄ λλλ€. μΌλλ€ κ΄κ³λ μ΄ν΄, κ΄λ¦¬, νμ₯νλλ° λ μ½λ€.
- MediatorPatternμ κ°μ²΄κ° νλνλ λ°©λ²μ μΆμν μν¨λ€. Mediationλ₯Ό λ
립μ μΈ κ°λ
μΌλ‘ λ§λ€κ³ νλμ κ°μ²΄μ μΊ‘μννλ κ²μ μ¬λ¬λΆμΌλ‘ νμ¬κΈ κ°μ²΄μ νμλ μ μ³λκ³ κ·Έ interactionμ μ§μ€νκ² ν΄μ€λ€. μ΄λ κ°μ²΄κ° μμ€ν
λ΄μμ μ΄λ»κ² interactνλ λ°©λ²μ λͺ
νν νλλ° λμμ μ€λ€.
- MediatorPatternμ μ μ΄λ₯Ό μ§μ€ννλ€. Mediatorλ interactionμ 볡μ‘λλ₯Ό mediatorμ 볡μ‘λμ λ§λ°κΏ¨λ€. Mediatorκ° protocolλ€μ encapsulateνκΈ° λλ¬Έμ colleagueκ°μ²΄λ€ λ³΄λ€ λ 볡μ‘νκ² λμ΄μ§ μ μλ€. μ΄κ²μ΄ mediatorλ₯Ό κ΄λ¦¬κ° μ΄λ €μ΄ monolith ννλ₯Ό λ°κ² λ§λ€ μ μλ€.
1.8. Implementation ¶
λ€μ ꡬνκ³Ό κ΄λ ¨λ issueλ€μ MediatorPatternκ³Ό κ΄λ ¨μ΄ μλ€.
- μΆμ Mediator ν΄λμ€ μλ΅νκΈ°. μΆμ Mediator ν΄λμ€λ₯Ό μ μΈν νμκ° μλ κ²½μ°λ colleagueλ€μ΄ λ¨μ§ νλμ mediatorμλ§ μμ
μ ν λμ΄λ€. Mediatorν΄λμ€κ° μ 곡νλ μΆμμ μΈ couplingμ colleagueλ€μ΄ λ€λ₯Έ mediator subclassλ€κ³Ό μλνκ² ν΄μ£Όλ©° λ°λμ κ²½μ°λ κ·Έλ λ€.
- Colleague-Mediator communication. colleagueλ€μ κ·Έλ€μ mediatorμ ν₯λ―Έλ‘μ΄ μ΄λ²€νΈκ° λ°μνμ λ, ν΅μ μ ν΄μΌνλ€. νκ°μ§ λ°©λ²μ mediatorλ₯Ό Observerλ‘μ(ObserverPatternμ μ΄μ©ν΄μ) ꡬννλ κ²μ΄λ€. colleague κ°μ²΄λ€μ Subjectλ€λ‘μ μλνκ³ , μμ μ μνκ° λ³νμ λ, μ§μλ₯Ό Mediatorμκ² μ λ¬νλ€. Mediatorλ λ³νμ ν¨κ³Όλ₯Ό λ€λ₯Έ colleagueλ€μκ² μ λ¬νλ λ°μμ νλ€.
1.9. Sample Code ¶
μ°λ¦¬λ DialogDirectorλ₯Ό Motivationμμ 보μλ κ²μ²λΌ font dialogλ₯Ό ꡬννκΈ° μν΄μ μ¬μ©ν κ²μ΄λ€. μΆμ ν΄λμ€ DialogDirectorλ directorλ€μ μν interfaceλ₯Ό μ μ νκ³ μλ€.
~cpp class DialogDirector { public: virtual ~DialogDirector(); virtual void ShowDialog(); virtual void WidgetChanged(Widget) = 0; protected: DialogDirector(); virtual void CreateWidgets() = 0; };
Widget μ widgetsλ€μ μν μΆμ κΈ°μ΄ ν΄λμ€μ΄λ€. νλμ widgetμ μμ μ directorλ₯Ό μκ³ μλ€.
~cpp class Widget { public: Widget(DialogDirector*); virtual void Changed(); virtual void handleMouse(MouseEvent& event); //... private: DialogDirector* _director; };
changed λ directorμ WidgetChanged μ°μ°μ νΈμΆνλ€. Widgetλ€μ μμ μ directorμ WidgetChanged νΈμΆμ μλ―Έμλ μ΄λ²€νΈλ₯Ό μμ Έμ£ΌκΈ° μν΄μ μ¬μ©νλ€.
~cpp void Widget::Changed() { _director->WidgetChanged(this); }
DialogDirectorμ subclassλ€μ μ μ ν widgetμλνκΈ° μν΄μ WidgetChangedλ₯Ό overrideν΄μ μ΄μ©νλ€. widgetμ μμ μ refereceλ₯Ό WidgetChangedμ argumentλ‘μ λ겨μ€μΌλ‘μ μ΄λ€ widgetμ μνκ° λ°λμλμ§λ₯Ό directorλ‘ νμ¬κΈ μκ²ν΄μ€λ€. DialogDirectorμ subclassλ€μ CreateWidget μμ μΆμ μ°μ°μλ₯Ό λ€μ΄μΌλ‘κ·Έμ widgetλ€μ λ§λ€κΈ° μν΄ μ¬μ μνλ€.
ListBox, EntryField, Buttonμ νΉνλ μ¬μ©μ μΈν°νμ΄μ€ μμλ₯Ό μν DialogDirectorμ subclassλ€μ΄λ€. ListBoxλ νμ¬ μ νμ μν΄μ GetSelectionμ°μ°μλ₯Ό μ 곡νλ€. κ·Έλ¦¬κ³ EntryFieldμ SetText μ°μ°μλ μλ‘μ΄ textλ‘ fieldλ₯Ό μ±μ΄λ€.
~cpp class ListBox:public Widget { public: ListBox(DialogDirector*); virtual const char* GetSelection(); virtual void SetList(List* listItems); virtual void HandMouse(MouseEvent& event); //.. }; class EntryField:public Widget { pblic: EntryField(DialogDirector*); virtual void SetText(const char* text); virtual const char* GetText(); virtual void handleMouse(MouseEvent& event); //... };
Buttonμ κ·Έκ²μ΄ λλ¬μ‘μ λ, Changedλ₯Ό νΈμΆνλ λ¨μν widgetμ΄λ€. μ΄λ HandleMouseλ₯Ό ꡬνν¨μΌλ‘μ¨ λμ΄μ§λ€.
~cpp class Button : public widget { public: button(DialogDirector*); virtual void SetText(const char* text); virtual void HandleMouse(MouseEvent& event); //... }; void Button::HandleMouse(MouseEvent& event) { //.... Change(); }
FontDialogDirector ν΄λμ€λ λ€μ΄μΌλ‘κ·Έ λ°μ€μ widgetsμ¬μ΄μ μ€κ°μ΄ μμΉνλ€. FontDialogDirectorλ DialogDirectorμ νμ ν΄λμ€μ΄λ€.
~cpp class FontDialogDirector:public DialogDirector { public: FontDialogDirector(); virtual ~FontDialogDirector(); virtual void WidgetChanged(Widget*); protected: virtual void CreateWidgets(); private Button* _ok; Buton* _cancel; ListBox* _fontList; entryField* _fontName; };
FontDialogDirectorλ κ·Έκ²μ΄ displayνλ widgetμ μΆμ νλ€. κ·Έκ²μ widgetλ€μ λ§λ€κΈ° μν΄μ CreateWidgetμ μ¬μ μνκ³ κ·Έκ²μ referenceλ‘ κ·Έκ²λ€μ μ΄κΈ°ννλ€.
~cpp void FontDialogDirector::CreateWidgets() { _ok = new Button(this); _cnacel = new Button(this); _fontList = new ListBox(this); _fontName = new EntryField(this); // fill the listBox white the available font names // assemble the widgets in the dialog };
WidgetChangedλ widgetλ€μ΄ μλ‘ μ μ νκ² λμνλ κ²μ νμ νκ² νλ€.
~cpp void FontDialogDirector::WidgetChanged( Widget* theChangedWidget ) { if(theChangedWidget ==_fontList) { _fontName->GetTet(_fontList->GetSelection()); } else if (theChangedWidget == _ok) { //apply font chnage and dismiss dialog //... } else if (theChangedWidget ==_cancel) { //dismiss dialog } }
WidgetChangedμ 볡μ‘μ±μ κ·Έλ§νΌ λ€μ΄μΌλ‘κ·Έ 볡μ‘μ±μ λμΈλ€. λ¬Όλ‘ ν° λ€μ΄μΌλ‘κ·Έλ λ€λ₯Έ μ΄μ λ‘ μΈν΄μ λ°λμ§νμ§ λͺ»νμ§λ§, mediator 볡μ‘μ±μ λ€λ₯Έ applicationλ€μμ ν¨ν΄μ μμ μ μνμν¨λ€.
1.10. Known Uses ¶
ET++WGM88μ THINK C class librarySm93bλ λ€μ΄μΌλ‘κ·Έμμ widgetλ€ μ¬μ΄μ mediatorλ‘μ directorμ μ μ¬ν κ°μ²΄λ₯Ό μ¬μ©νλ€.
μλμ°μ© Smalltalk/Vμ applicationꡬ쑰λ mediator ꡬ쑰μ κ°λ°μ λκ³ μλ€.LaL94 κ·Έλ° νκ²½μμ applicationμ μλμ°λ₯Ό paneλ€μ λͺ¨μμΌλ‘ ꡬμ±νκ³ μλ€. libraryλ λͺλͺμ μ΄λ―Έ μ μλ paneλ€μ κ°μ§κ³ μλ€. μλ₯Ό λ€μλ©΄ TextPane, ListBox, Buttonλ±λ±μ΄ ν¬ν¨λλ€. μ΄λ¬ν paneλ€μ subclassingμμ΄ μ΄μ©λ μ μλ€. Application κ°λ°μλ λ¨μ§ inter-pane coordinationν μ±
μμ΄ μλ ViewManagerλ§ subclassingν μ μλ€. ViewManageλ Mediatorμ΄κ³ κ°κ°μ paneλ€μ μμ μ ownerλ‘μ λ¨μ§ μμ μ ViewManagerλ₯Ό μκ³ μλ€. paneλ€μ μ§μ μ μΌλ‘ μλ‘ μ‘°ννμ§ μλλ€.
λ€μ object diagramμ run-timeμ applicationμ snapshotμ 보μ¬μ£Όκ³ μλ€.
SmallTalk/Vλ Pane-ViewManager ν΅μ μ μν΄ event κΈ°λ²μ μ¬μ©νκ³ μλ€. μ΄λ€ paneμ μ΄λ€ μ 보λ₯Ό mediatorλ‘ λΆν° μ»κΈ° μνκ±°λ μ΄λ€ μλ―Έμλ μΌμ΄ λ°μν΄μ μ΄λ₯Ό mediatorμκ² μλ €μ£ΌκΈ° μν΄μ eventλ₯Ό μμ±νλ€. νλμ eventλ κ·Έ eventλ₯Ό μλ³νλ symbolμ μ μνλ€. κ·Έ eventλ₯Ό λ€λ£¨κΈ° μν΄μ ViewManagerλ paneμ method selectorλ₯Ό λ±λ‘νλ€. μ΄ selectorλ eventμ handlerμ΄λ€. μ΄κ²μ eventκ° λ°μν λλ©΄ μΈμ λ μ§ μνλ κ²μ΄λ€.
λ€μ μ½λ μΈμ©μ ListBoxκ° ViewManager subclass λ΄μμ λ§λ€μ΄μ§λ λ°©λ²κ³Ό #select eventλ₯Ό μν΄ ViewManagerκ° event handlerλ₯Ό λ±λ‘νλ λ°©λ²μ 보μ¬μ£Όκ³ μλ€.
~cpp self addSubpane: (ListPane new paneName: 'myListPane'; owner: self; when: #select perform: #listSlet:).
MediatorPatternμ λλ€λ₯Έ applicationμ coordinating complex updatesμ μλ€. νλμ μλ Observerλ‘μ μΈκΈλμ΄μ§λ ChangeManager classμ΄λ€. ChangeManagerλ μ€λ³΅ updateλ₯Ό νΌνκΈ° μν΄μ subjectsκ³Ό observersμ€κ°μ μμΉνλ€. κ°μ²΄κ° λ³ν λ, ChangeManagerμκ² μλ¦°λ€. κ·Έλμ ChangeManagerλ κ°μ²΄μ dependecyλ₯Ό μ리λ κ²μΌλ‘ updateλ₯Ό μ‘°μ νλ€.
μ μ¬ν applicationμ Unidraw drawing frameworkμμ λνλκ³ VL90 connectorsμ¬μ΄μ μ°κ²°μ± μ μ½λ€μ μ μ©νλ CSolverλΌ λΆλ¦¬λ classλ₯Ό μ¬μ©νλ€. κ·Έλν½ νΈμ§κΈ°μμ κ°μ²΄λ€μ λ€λ₯Έ λ°©λ²μΌλ‘ μλ‘ λ€λ₯Έ κ°μ²΄λ€μ μ§μ§λ κ²μΌλ‘ λ³΄μΌ μ μλ€. connectorλ€μ μ°κ²°μ±μ΄ μλμ μΌλ‘ κ΄λ¦¬λλ κ·Έλ¦Ό νΈμ§κΈ°λ νλ‘ μ€κ³ μμ€ν
κ³Ό κ°μ applicationλ€μμ μ μ©νλ€. CSolverλ κ°μ²΄λ€ μ¬μ΄μ mediatorμ΄λ€. κ·Έκ²μ μ°κ²°μ μ½μ ν΄κ²°νκ³ , connectorλ€μ μμΉλ₯Ό κ·Έκ²λ€μ λ°μνκΈ° μν΄μ updateνλ€.
1.11. Related Patterns ¶
FacadePattern(185)μ λ³΄λ€ νΈλ¦¬ν μΈν°νμ΄μ€λ₯Ό μ 곡νκ³ μ subsystemμ κ°μ²΄λ€μ μΆμνμν¨ Mediatorμ λ€λ₯΄λ€. κ·Έκ²μ protocolμ κ°μ μ μ΄λ€. λ€μ λ§νλ©΄ Facade κ°μ²΄λ€μ subsystemμ μμ²λ€μ λ§λ€μ§λ§ λ°λμ κ²½μ°λ κ·Έλ μ§ λͺ»νλ€. λμ‘°μ μΌλ‘ Mediatorλ colleagueλ€μ΄ μ 곡νμ§ λͺ»νκ±°λ ν μ μλ νλμ μΈ νμλ₯Ό κ°λ₯νκ² ν΄μ€λ€. κ·Έλμ κ·Έ protocolμ multidirectionalνλ€.
κΈ°λ³Έμ μΌλ‘ FacadePatternμ ν΄λμ€ μ§λ¨μ΄ μκ³ , κ·Έ ν΄λμ€ μ§λ¨μ μ¬μ©νλ μΈλΆ ν΄λμ€μ μ
μ₯μμ νμν ν¨ν΄μ΄κ³ , MediatorPatternμ ν΄λμ€ μ§λ¨μ΄ μκ³ , κ·Έ ν΄λμ€ μ§λ¨ λ΄λΆμμ μλ‘λ₯Ό μ¬μ©νκΈ° μν ν¨ν΄μ΄λ€.
μ컨λ,
ElevatorSimulationμ μ¬λ¬κ°μ§ λ°°μ°(μλ λ² μ΄ν°, μ¬λ, μΈ΅, ...)λ€μ΄ μ‘΄μ¬ν κ²½μ°, μ¬λμ μΈ΅μ μ°Έμ‘°, μ¬μ©νκ³ , μΈ΅μ λ€μ κ°κ³ μλ μ¬λμ μ°Έμ‘°νκ³ , μλ λ² μ΄ν°λ μ¬λμ μ°Έμ‘°, μ¬μ©νκ³ νλ μμΌλ‘ 볡μ‘ν (μν) μμ‘΄κ΄κ³κ° μ‘΄μ¬νλ€. μ΄λ΄ λ MediatorPatternμ μ°κ²λλ©΄ μ΄ λ³΅μ‘ν μμ‘΄κ³ λ¦¬λ₯Ό λμ μ μλ€.

colleagueλ€μ observer(293) patternμ μ΄μ©νλ Mediatorμ ν΅μ ν μ μλ€.
Facade μ Mediator λ₯Ό κ°λ νΌλνμλλ°. ν¬λ‘μ΄ν κ°μ¬κ°μ¬μ~~ --1002