시스템 설계 및 디자인/디자인 패턴
[디자인패턴][Mediator] 중재자 패턴
앤테바
2022. 3. 24. 17:34
반응형
중재자 패턴 정의
- 클래스 간의 복잡한 관계들을 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴
- M개의 객체들 사이에 중재자를 추가하여 중재자가 모든 객체들의 통신을 담당
- 각 객체들은 서로 알 필요가 없고 중재자 클래스가 관리하므로 loose coupling을 유지
- 옵저버 패턴은 1개의 publisher(subject)가 N개의 subscriber(observer)에 대해서 push하는 방식을 통해 관리하지만 중재자 패턴은 M개의 publisher와 N개의 subscriber 사이에서 1개의 중재자(mediator)를 통해서 통신하는 방식
중재자 패턴은
복잡한 M개의 객체 사이에 N개의 관계가 형성되어 있을 때
M개의 객체 사이에 중재자를 하나 넣어서
이를 M:1 관계로 바꿔준다.
중재자 패턴 언제 사용?
- 객체들 사이에 너무 많은 관계가 맺어져 있을 때
- 객체들 사이에 상호작용 관계가 복잡할 때
중재자 패턴 적용 전 (M:N 관계) | 중재자 패턴 적용 후 (M:1 관계) |
![]() |
![]() |
중재자 패턴 클래스 다이어그램
중재자 패턴 활용
메세지 전송(채팅 프로그램)을 중재파 패턴을 적용한 예시입니다.
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
반응형