U E D R , A S I H C RSS

Gof/Mediator


1. Mediator


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 둜 μ „λ‹¬λ˜κ³  μžˆλŠ” μ΄λ²€νŠΈλ“€μ˜ 흐름이 μžˆλ‹€.
  1. 리슀트 λ°•μŠ€κ°€ κ·Έκ²ƒμ˜ directorμ—κ²Œ 그것이 λ³€ν–ˆλ‹€κ³  λ§ν•œλ‹€.
  2. directorλŠ” 리슀트 λ°•μŠ€λ‘œ λΆ€ν„° 선택을 μ–»λŠ”λ‹€.
  3. directorλŠ” μž…λ ₯ ν•„λ“œλ‘œ 선택을 λ„˜κΈ΄λ‹€.
  4. 이제 μž…λ ₯ ν•„λ“œλŠ” μ–΄λ–€ λ¬ΈμžλΌ ν¬ν•¨ν•œλ‹€. 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.4. Structure



μ „ν˜•μ μΈ 객체 κ΅¬μ‘°λŠ” μ΄λ ‡κ²Œ 보일 것이닀:


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은 λ‹€μŒκ³Ό 같은 μž₯점과 단점을 μ§€λ‹Œλ‹€.
  1. MediatorPattern은 subclassing을 μ œν•œν•œλ‹€. mediatorλŠ” λ‹€μ‹œλ§ν•΄ λͺ‡λͺ‡κ°œμ˜ 객체듀 사이에 λΆ„μ‚°λ˜μ–΄μ§ˆ ν–‰μœ„λΌ μ§‘μ€‘ν•œλ‹€. 이런 ν–‰μœ„λΌ λ°”κΎΈλŠ” 것은 단지 MediatorλΌ subclassingν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. Colleague ν΄λž˜μŠ€λ“€μ€ μž¬μ‚¬μš©λ˜μ–΄μ§ˆ 수 μžˆλ‹€.
  2. MediatorPattern은 colleague듀을 λ–Όμ–΄λ†“λŠ”λ‹€. MediatorλŠ” colleagueλ“€ μ‚¬μ΄μ—μ„œ loose coupling을 μ΄‰μ§„ν•œλ‹€. colleagued와 MediatorλΌ κ°œλ³„μ μœΌλ‘œ λ‹€μ–‘ν•˜κ²Œ ν•  수 있고, μž¬μ‚¬μš© ν•  수 μžˆλ‹€.
  3. MediatorPattern은 객체 protocols을 λ‹¨μˆœν™” μ‹œν‚¨λ‹€. MediatorλŠ” λ‹€λŒ€λ‹€ μƒν˜Έκ΄€κ³„λΌ Mediator와 colleagueλ“€ μ‚¬μ΄μ˜ μΌλŒ€λ‹€ κ΄€κ³„λ‘œ λ°”κΎΈμ–΄ λ†“λŠ”λ‹€. μΌλŒ€λ‹€ κ΄€κ³„λŠ” 이해, 관리, ν™•μž₯ν•˜λŠ”λ° 더 쉽닀.
  4. MediatorPattern은 객체가 ν˜‘λ™ν•˜λŠ” 방법을 좔상화 μ‹œν‚¨λ‹€. MediationλΌ λ…λ¦½μ μΈ κ°œλ…μœΌλ‘œ λ§Œλ“€κ³  ν•˜λ‚˜μ˜ 객체에 μΊ‘μŠν™”ν•˜λŠ” 것은 μ—¬λŸ¬λΆ„μœΌλ‘œ ν•˜μ—¬κΈˆ 객체의 ν–‰μœ„λŠ” μ œμ³λ‘κ³  κ·Έ interaction에 μ§‘μ€‘ν•˜κ²Œ ν•΄μ€λ‹€. μ΄λŠ” 객체가 μ‹œμŠ€ν…œ λ‚΄μ—μ„œ μ–΄λ–»κ²Œ interactν•˜λŠ” 방법을 λͺ…ν™•νžˆ ν•˜λŠ”λ° 도움을 μ€λ‹€.
  5. MediatorPattern은 μ œμ–΄λΌ μ§‘μ€‘ν™”ν•œλ‹€. MediatorλŠ” interaction의 λ³΅μž‘λ„λΌ mediator의 λ³΅μž‘λ„μ™€ λ§žλ°”κΏ¨λ‹€. Mediatorκ°€ protocol듀을 encapsulateν–ˆκΈ° λ•Œλ¬Έμ— colleague객체듀 보닀 더 λ³΅μž‘ν•˜κ²Œ λ˜μ–΄μ§ˆ 수 μžˆλ‹€. 이것이 mediatorλΌ κ΄€λ¦¬κ°€ μ–΄λ €μš΄ monolith ν˜•νƒœλΌ λ›°κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

1.8. Implementation

λ‹€μŒ κ΅¬ν˜„κ³Ό κ΄€λ ¨λœ issue듀은 MediatorPatternκ³Ό 관련이 μžˆλ‹€.
  1. 좔상 Mediator 클래슀 μƒλž΅ν•˜κΈ°. 좔상 Mediator ν΄λž˜μŠ€λΌ μ„ μ–Έν•  ν•„μš”κ°€ μ—†λŠ” κ²½μš°λŠ” colleague듀이 단지 ν•˜λ‚˜μ˜ mediatorμ™€λ§Œ μž‘μ—…μ„ ν•  λ•Œμ΄λ‹€. Mediatorν΄λž˜μŠ€κ°€ μ œκ³΅ν•˜λŠ” 좔상적인 coupling은 colleague듀이 λ‹€λ₯Έ mediator subclassλ“€κ³Ό μž‘λ™ν•™κ²Œ ν•΄μ£Όλ©° λ°˜λŒ€μ˜ κ²½μš°λ„ κ·Έλ ‡λ‹€.
  2. Colleague-Mediator communication. colleague듀은 κ·Έλ“€μ˜ mediator와 ν₯λΈλ‘œμš΄ μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ, 톡신을 ν•΄μ•Όν•œλ‹€. ν•œκ°€μ§€ 방법은 mediatorλΌ Observerλ‘œμ„œ(ObserverPattern을 μ΄μš©ν•΄μ„œ) κ΅¬ν˜„ν•˜λŠ” 것이닀. colleague 객체듀은 Subjectλ“€λ‘œμ„œ μž‘λ™ν•˜κ³ , μžμ‹ μ˜ μƒνƒœκ°€ λ³€ν–ˆμ„ λ•Œ, μ§€μ‹œλΌ Mediatorμ—κ²Œ μ „λ‹¬ν•œλ‹€. MediatorλŠ” λ³€ν™”μ˜ νš¨κ³ΌλΌ λ‹€λ₯Έ colleagueλ“€μ—κ²Œ μ „λ‹¬ν•˜λŠ” λ°˜μ‘μ„ ν•œλ‹€.

또 λ‹€λ₯Έ 방법은 colleague듀이 보닀 더 μ§μ ‘μœΌλ‘œ communicationν•  수 μžˆλ„λ‘ νŠΉλ³„ν•œ interfaceλΌ mediatorμ—κ²Œ μ‹¬λŠ” 것이닀. μœˆλ„μš°μš© Smalltalk/Vκ°€ λŒ€ν‘œμ μΈ ν˜•νƒœμ΄λ‹€. mediator와 톡신을 ν•˜κ³ μž ν•  λ•Œ, μžμ‹ μ„ argument둜 λ„˜κ²¨μ„œ mediatorκ°€ senderκ°€ λˆ„κ΅¬μΈμ§€ μ‹λ³„ν•˜κ²Œ ν•œλ‹€. Sample CodeλŠ” 이와 같은 방법을 μ‚¬μš©ν•˜κ³  있고, Smalltalk/V의 κ΅¬ν˜„μ€ Known Usesμ—μ„œ λ‹€λ£¨κΈ°λ‘œ ν•˜κ² λ‹€.

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은 클래슀 집단이 있고, κ·Έ 클래슀 집단 λ‚΄λΆ€μ—μ„œ μ„œλ‘œλΌ μ‚¬μš©ν•˜κΈ° μœ„ν•œ νŒ¨ν„΄μ΄λ‹€.

μ˜ˆμ»¨λŒ€, Seminar:ElevatorSimulation에 μ—¬λŸ¬κ°€μ§€ 배우(μ—˜λ ˆλ² μ΄ν„°, μ‚¬λžŒ, μΈ΅, ...)듀이 μ‘΄μž¬ν•  경우, μ‚¬λžŒμ€ 측을 μ°Έμ‘°, μ‚¬μš©ν•˜κ³ , 측은 λ‹€μ‹œ κ°–κ³  μžˆλŠ” μ‚¬λžŒμ„ μ°Έμ‘°ν•˜κ³ , μ—˜λ ˆλ² μ΄ν„°λŠ” μ‚¬λžŒμ„ μ°Έμ‘°, μ‚¬μš©ν•˜κ³  ν•˜λŠ” μ‹μœΌλ‘œ λ³΅μž‘ν•œ (μˆœν™˜) μ˜μ‘΄κ΄€κ³„κ°€ μ‘΄μž¬ν•œλ‹€. 이럴 λ•Œ MediatorPattern을 μ“°κ²Œλ˜λ©΄ 이 λ³΅μž‘ν•œ μ˜μ‘΄κ³ λ¦¬λΌ λŠμ„ 수 μžˆλ‹€.

colleague듀은 observer(293) pattern을 μ΄μš©ν•˜λŠ” Mediator와 톡신할 수 μžˆλ‹€.


Facade 와 Mediator λΌ κ°€λ” ν˜Όλ™ν–ˆμ—ˆλŠ”λ°. ν¬λ‘μ΄ν˜• κ°μ‚¬κ°μ‚¬μš”~~ --1002



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:18
Processing time 0.0788 sec