A A
[Design Pattern] Mediator Pattern - ๋งค๋””์—์ดํ„ฐ ํŒจํ„ด

Mediator Pattern

Mediator ํŒจํ„ด์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์—์„œ ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ค‘์žฌํ•˜๋Š” ์ค‘์žฌ์ž(Mediator) ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋“ค์ด ์ง์ ‘์ ์œผ๋กœ ์„œ๋กœ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  ํ†ต์‹ ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

  • ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ์ƒํ˜ธ์ž‘์šฉ์„ ํ•œ ๊ณณ์— ์ง‘์ค‘์‹œ์ผœ์„œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ๊ฐ์ฒด๊ฐ„์˜ ๋ณต์žกํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด๋“ค์ด ์ง์ ‘ ํ†ต์‹ ํ•˜๋Š” ๋Œ€์‹  Mediator๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ํ†ต์‹ ํ•˜๋„๋ก ํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์ฝ”๋“œ์˜ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

 

  • Mediator๋Š” ์ค‘๊ฐœ์ธ, ๊ฐ ํšŒ์›๋“ค์€ colleage ์ž…๋‹ˆ๋‹ค.


Diagram of Mediator Pattern

Mediator๋Š” ์ค‘๊ฐœ์ธ, ๊ฐ ํšŒ์›๋“ค์€ colleage ์ž…๋‹ˆ๋‹ค.

 

Object๊ฐ„์˜ ์ง์ ‘์ ์ธ Communication์ด ์žˆ๋Š” ๊ฒฝ์šฐ

  • ์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด A, B, C, D Object๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • A์—์„œ B,C์˜ Method๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • C์—์„œ B,D์˜ Method๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ง์ ‘์ ์œผ๋กœ Object๊ฐ„์˜ Method๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ทธ ๊ตฌ์กฐ์˜ Dependency๊ฐ€ ๋ณต์žกํ•ด ์ง‘๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Object์˜ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • Mediator Object๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ชจ๋“  Communication์ด Mediator๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฃจ์–ด ์ง€๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
Object๊ฐ„์˜ ๋ณต์žกํ•œ Dependency๊ฐ€ ์—†์–ด์ง€๊ณ  Object๋“ค์˜ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Mediator Pattern Example

์˜ˆ์‹œ) ์Šค๋งˆํŠธ ํ™ˆ ์‹œ์Šคํ…œ → ์Šค๋งˆํŠธ ์‹œ๊ณ„, ์กฐ๋ช…, ์Šคํ”ผ์ปค ์‚ฌ์šฉ
  • ์Šค๋งˆํŠธ ์‹œ๊ณ„๊ฐ€ ์šธ๋ฆฌ๋ฉด ์Šค๋งˆํŠธ ์กฐ๋ช…์ด ์ผœ์ง€๊ณ , ์Šค๋งˆํŠธ ์Šคํ”ผ์ปค์—์„œ ๋…ธ๋ž˜๊ฐ€ ๋‚˜์˜ค๊ฒŒ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
    • ์Šค๋งˆํŠธ ์‹œ๊ณ„ Object์—์„œ ์Šค๋งˆํŠธ ์กฐ๋ช…๊ณผ ์Šคํ”ผ์ปค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์Šค๋งˆํŠธ ์กฐ๋ช…์„ ๋„๋ฉด ์Šค๋งˆํŠธ ์Šคํ”ผ์ปค๋„ ๊บผ์ง€๊ฒŒ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ, ์กฐ๋ช… Object ์•ˆ์—๋Š” ์Šค๋งˆํŠธ ์Šคํ”ผ์ปค Object ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

Object๊ฐ„์˜ ์ง์ ‘์ ์ธ Communication์ด ์žˆ๋Š” ๊ฒฝ์šฐ

  • ์ด๋Ÿฐ ์‹์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ ๊ฐ„์˜ Dependency๊ฐ€ ๋งŒ๋“ค์–ด ์ง€๋ฉด ์Šค๋งˆํŠธ ์กฐ๋ช…๊ณผ ์Šค๋งˆํŠธ ์‹œ๊ณ„๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„๋•Œ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  Communication์„ ํ•˜๋‚˜์˜ Object๊ฐ€ ๋‹ด๋‹นํ•˜๋Š” Mediator Pattern์„ ์ ์šฉ์‹œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

Example ์—์„œ ๋“ฑ์žฅ ํด๋ž˜์Šค

 

  • Mediator: Notify() ์‹œ๊ทธ๋„์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค.
  • HomeMedia
    • Mediator๋ฅผ ์ƒ์† ๋ฐ›์Šต๋‹ˆ๋‹ค.
    • Notify()๋กœ ๋“ค์–ด์˜ค๋Š” ์‹œ๊ทธ๋„์„ ๋ถ„๋ฐฐํ•˜๊ธฐ ์œ„ํ•ด์„œ clock, light, speaker reference๋ฅผ ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค.
  • Clock, Light, Speaker
    • ๋‚ด๋ถ€์— Mediator๋ฅผ ํ†ตํ•ด ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— Mediator reference ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

class Mediator:
    def notify(self, signal: str):
        pass
  • Mediator class - Notify()
    • ์‹œ๊ทธ๋„์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • argument๋กœ string ํƒ€์ž…์˜ signal ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

class Clock:
    def setMediator(self, mediator: Mediator):
        self.mediator = mediator
    
    def Alarm(self):
        print("alarm on")
        self.mediator.notify('AlarmOn')

class Light:
    def setMediator(self, mediator: Mediator):
        self.mediator = mediator
    
    def On(self):
        print("light On")
    
    def Off(self):
        print("light off")
        self.mediator.notify('LightOff')

class Speaker:
    def setMediator(self, mediator: Mediator):
        self.mediator = mediator
    
    def On(self):
        print("speaker on")
    
    def Off(self):
        print("speaker off")

 

Clock class

  • setMediator(): Mediator๋ฅผ ์„ค์ •ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆใ….
  • Alarm()
    • “alarm on”๋ฉ”์‹œ์ง€ ์ถœ๋ ฅํ›„, Mediator์— “AlarmOn” signal ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

Light, Speaker class

  • setMediator(): Mediator๋ฅผ ์„ค์ •ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • On()
    • ๊ฐ๊ฐ Light์™€ Speaker๊ฐ€ ์ผœ์กŒ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • Off()
    • ๊ฐ๊ฐ Light์™€ Speaker๋ฅผ ๊ป๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    • Light๋Š” Mediator์— “LightOff” signal์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

 

class HomeMedia(Mediator):
    def __init__(self, clock, light, speaker):
        self.clock = clock
        self.light = light
        self.speaker = speaker
    
    def notify(self, signal: str):
        if signal == 'AlarmOn':
            self.speaker.On()
            self.light.On()
        elif signal == 'LightOff':
            self.speaker.Off()

 

 

HomeMediator ํด๋ž˜์Šค

  • ์—ญํ• : Mediator๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ์ž (Constructor): clock, light, speaker ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

notify ๋ฉ”์„œ๋“œ

  • ์—ญํ• : ์Šค๋งˆํŠธ ํ™ˆ ์‹œ์Šคํ…œ์—์„œ ๋ชจ๋“  ์‹œ์Šคํ…œ์„ ์ค‘์žฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์‹œ๊ทธ๋„: 'AlarmOn' ๋˜๋Š” 'LightOff'์ผ ๋•Œ์˜ ํ–‰๋™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • Signal์ด 'AlarmOn'์ธ ๊ฒฝ์šฐ:
      1. speaker๋ฅผ ์ผญ๋‹ˆ๋‹ค.
      2. light๋ฅผ ์ผญ๋‹ˆ๋‹ค.
      • ์Šค๋งˆํŠธ ์‹œ๊ณ„๊ฐ€ ์šธ๋ฆฌ๋ฉด ์Šค๋งˆํŠธ ์กฐ๋ช…์ด ์ผœ์ง€๊ณ  ์Šค๋งˆํŠธ ์Šคํ”ผ์ปค์—์„œ ๋…ธ๋ž˜๊ฐ€ ๋‚˜์˜ค๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • Signal์ด 'LightOff'์ธ ๊ฒฝ์šฐ:
      1. speaker๋ฅผ ๋•๋‹ˆ๋‹ค.
      • ์Šค๋งˆํŠธ ์กฐ๋ช…์„ ๋„๋ฉด ์Šค๋งˆํŠธ ์Šคํ”ผ์ปค ๋˜ํ•œ ๊บผ์ง€๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

  • Clock, Light, Speaker ๊ฐ๊ฐ์˜ Object๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
clock = Clock()
light = Light()
speaker = Speaker()

 

  • HomeMediator Object ์ƒ์„ฑ ๋ฐ Clock, light, speaker reference๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.
mediator = HomeMediator(clock, light, speaker)

 

  • ๊ฐ๊ฐ์˜ Object๋“ค์— ๋Œ€ํ•ด์„œ mediator reference๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
clock.setMediator(mediator)
light.setMediator(mediator)
speaker.setMediator(mediator)

 

  • ์‹œ๊ณ„์—์„œ ์•Œ๋žŒ ์šธ๋ฆฐ ๊ฒฝ์šฐ ์•Œ๋žŒ, ์กฐ๋ช…, ์Šคํ”ผ์ปค๊ฐ€ ์ผœ์ง‘๋‹ˆ๋‹ค.
clock.Alarm()
# "alarm on", "speaker on", "light On"

 

  • ์กฐ๋ช… ์ „์› ๋ˆ ๊ฒฝ์šฐ ์กฐ๋ช…์ด ๊บผ์ง€๊ณ  ์Šคํ”ผ์ปค๊ฐ€ ๊บผ์ง‘๋‹ˆ๋‹ค.
light.Off()    # "light off", "speaker off"

 

Mediator Pattern์˜ ํ•ต์‹ฌ์€ Object๊ฐ„์˜ Directํ•œ Communication์„ Mediator๋กœ ๋Œ๋ฆผ์œผ๋กœ์จ Object๊ฐ„์˜ Dependency๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.