소프트웨어에 대한 모든 것

[디자인패턴][Mediator] 중재자 패턴 본문

시스템 설계 및 디자인/디자인 패턴

[디자인패턴][Mediator] 중재자 패턴

앤테바 2022. 3. 24. 17:34
반응형

중재자 패턴 정의

  • 클래스 간의 복잡한 관계들을 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴
  • M개의 객체들 사이에 중재자를 추가하여 중재자가 모든 객체들의 통신을 담당
  • 각 객체들은 서로 알 필요가 없고 중재자 클래스가 관리하므로 loose coupling을 유지
  • 옵저버 패턴은 1개의 publisher(subject)가 N개의 subscriber(observer)에 대해서 push하는 방식을 통해 관리하지만 중재자 패턴은 M개의 publisher와 N개의 subscriber 사이에서 1개의 중재자(mediator)를 통해서 통신하는 방식

Mediator 패턴 예시, 출처 - https://refactoring.guru/design-patterns/mediator

 

 

 

중재자 패턴은
복잡한 M개의 객체 사이에 N개의 관계가 형성되어 있을 때
M개의 객체 사이에 중재자를 하나 넣어서
이를 M:1 관계로 바꿔준다.

 

중재자 패턴 언제 사용?

  • 객체들 사이에 너무 많은 관계가 맺어져 있을 때
  • 객체들 사이에 상호작용 관계가 복잡할 때
중재자 패턴 적용 전 (M:N 관계) 중재자 패턴 적용 후 (M:1 관계)

중재자 패턴 클래스 다이어그램

Mediator 패턴 Class Diagram

중재자 패턴 활용

메세지 전송(채팅 프로그램)을 중재파 패턴을 적용한 예시입니다.

from abc import ABC, abstractmethod


class Mediator(ABC):
    @abstractmethod
    def add_user(self, user):
        """ 사용자 추가 """
        pass

    @abstractmethod
    def del_user(self, user):
        """ 사용자 삭제 """
        pass

    @abstractmethod
    def send_message(self, message, user):
        """ 메세지 전송 """
        pass


class ConcreteMediator(Mediator):
    def __init__(self):
        self.users = []

    def add_user(self, user):
        self.users.append(user)

    def del_user(self, user):
        if user in self.users:
            self.users.remove(user)

    def send_message(self, message, from_user):
        """ 메시지 보낸 사람을 제외하고 메시지 전송 """
        for user in self.users:
            if from_user != user:
                user.receive(message)


class Colleague(ABC):
    def __init__(self, mediator, name):
        self.mediator = mediator
        self.name = name

    @abstractmethod
    def send(self, message):
        pass

    @abstractmethod
    def receive(self, message):
        pass


class ConcreteColleague(Colleague):
    def __init__(self, mediator, name):
        self.mediator = mediator
        self.name = name

    def send(self, message):
        print(f'{self.name}, send message : {message}')
        self.mediator.send_message(message, self)

    def receive(self, message):
        print(f'{self.name}, received message : {message}')


mediator = ConcreteMediator()

user1 = ConcreteColleague(mediator, 'james')
user2 = ConcreteColleague(mediator, 'kebin')
user3 = ConcreteColleague(mediator, 'taylor')

mediator.add_user(user1)
mediator.add_user(user2)
mediator.add_user(user3)

user1.send('hello')
user2.send('nice to meet you')
user3.send('great!')

출력

james, send message : hello
kebin, received message : hello
taylor, received message : hello
kebin, send message : nice to meet you
james, received message : nice to meet you
taylor, received message : nice to meet you
taylor, send message : great!
james, received message : great!
kebin, received message : great!

참고 자료

https://sourcemaking.com/design_patterns/mediator

https://en.proft.me/2017/02/17/mediator-pattern-java-and-python/

https://pythonwife.com/mediator-design-pattern-with-python/

https://effectiveprogramming.tistory.com/entry/Mediator-%ED%8C%A8%ED%84%B4

https://medium.com/flutter-community/flutter-design-patterns-22-mediator-575e7aa6bfa9

https://brownbears.tistory.com/568

 

 

반응형
Comments