Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 파이썬릿코드풀기
- python zip_longest
- leetcode풀기
- 코틀린기초
- python xor
- 릿코드 파이썬
- 잇츠디모
- python 알고리즘
- 알고리즘풀이
- python priority queue
- leetcode풀이
- 알고리즘풀기
- 상가수익률계산기
- python sorted
- LeetCode
- leetcode 풀기
- 파이썬 알고리즘
- binary search
- 릿코드풀기
- 릿코드
- 릿코드풀이
- 파이썬 프로그래머스
- 릿코드 풀기
- 파이썬알고리즘풀기
- 파이썬알고리즘
- 파이썬릿코드
- python Leetcode
- 파이썬 릿코드
- python 릿코드
- 파이썬 알고리즘 풀기
Archives
- Today
- Total
소프트웨어에 대한 모든 것
[디자인패턴][Mediator] 중재자 패턴 본문
반응형
중재자 패턴 정의
- 클래스 간의 복잡한 관계들을 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴
- 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
반응형
'시스템 설계 및 디자인 > 디자인 패턴' 카테고리의 다른 글
[디자인패턴][Template Method] 템플릿 메소드 패턴 (2) | 2022.03.25 |
---|---|
[디자인패턴][Abstract Factory] 추상 팩토리 패턴 (0) | 2022.03.25 |
[디자인패턴][Observer] 옵저버 패턴 (0) | 2022.03.24 |
[디자인패턴][Prototype] 프로토타입 패턴 (0) | 2022.03.24 |
[디자인패턴][Composite] 컴포지트 패턴 (0) | 2022.03.24 |
Comments