본문 바로가기
DesignPattern

[Design Pattern] Mediator Pattern

by 봄석 2019. 10. 18.

[Design Pattern] Mediator Pattern

 

mediator(중재자) 패턴에 대하여 알아보고

예시를  java로 작성한 예와  kotlin으로 작성한 예를 보도록 하겠습니다.

 

 

Mediator Pattern 이란?

  • mediator pattern은 클래스 간의 상호작용을 하나의 클래스에 위임하여 처리하는 패턴입니다.
  • M:N의 관계에서 M:1의 관계로 복잡도를 떨어뜨려 유지보수 및 확장성에 유리합니다.(의존성이 적어집니다.)
  • 다른 객체의 존재를 모르는 상태에서도 메시지를 주고받을 수 있습니다.

 

 

특징

ConcreteColleague클래스는 Colleague(동료) interface를 구현하고 있는  N개의 객체입니다.

 ConcreteCollegue 클래스 간 데이터 전달을  위하여  Mediator를 이용합니다. 

 

 

Mediator Pattern with Java

public class ChatUser {
    private ChatMediator mediator;
    private String name;

    public ChatUser(ChatMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }

    public void send(String msg) {
        System.out.println(name + " Sending Message = " + msg);
        mediator.sendMessage(msg, this);
    }

    public void receive(String msg) {
        System.out.println(name + " Message received : " + msg);
    }
}
public class ChatMediator {
    private List<ChatUser> users = new ArrayList<>();

    public void sendMessage(String msg, ChatUser user) {
        users.stream()
                .filter(u -> u != user)
                .forEach(u -> u.receive(msg));
    }

    public ChatMediator addUser(ChatUser user) {
        users.add(user);
        return this;
    }
}
public class MediatorTest {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatMediator();

        ChatUser john = new ChatUser(mediator,"John");

        mediator.addUser(new ChatUser(mediator,"Alice"))
                .addUser(new ChatUser(mediator,"Bob"))
                .addUser(john);

        john.send("Hi every one!");
    }
}
//result

John: Sending Message= Hi everyone!
Alice: Message received: Hi everyone!
Bob: Message received: Hi everyone!

ChatUser는 ConcreteColleage입니다.  ChatUser끼리 채팅을 주고받기 위하여 

Mediator를 이용합니다.

 

Mediator에  ConcreteColleage를 등록하고 연결다리로 사용합니다.

 

Mediator Pattern with Kotlin

class ChatUser(private val mediator: ChatMediator, private val name: String) {
    fun send(msg: String) {
        println("$name: Sending Message= $msg")
        mediator.sendMessage(msg, this)
    }

    fun receive(msg: String) {
        println("$name: Message received: $msg")
    }
}
class ChatMediator {

    private val users: MutableList<ChatUser> = ArrayList()

    fun sendMessage(msg: String, user: ChatUser) {
        users
            .filter { it != user }
            .forEach { it.receive(msg) }
    }

    fun addUser(user: ChatUser): ChatMediator =
        apply { users.add(user) }
}
class MediatorTest {

    @Test
    fun `Mediator`() {
        val mediator = ChatMediator()

        val john = ChatUser(mediator, "John")

        mediator
            .addUser(ChatUser(mediator, "Alice"))
            .addUser(ChatUser(mediator, "Bob"))
            .addUser(john)

        john.send("Hi everyone!")
    }
}
//result

John: Sending Message= Hi everyone!
Alice: Message received: Hi everyone!
Bob: Message received: Hi everyone!

 

 

 

정리

단단히 결합되어 유지하기 어려운 일련의 객체를 처리해야 하는 경우 중재자 패턴이 적합합니다. 이러한 방식으로 객체 간의 종속성을 줄이고 전체적인 복잡성을 줄일 수 있습니다.

또한 중개자 개체를 사용하여 단일 구성 요소에 대한 통신 논리를 추출하므로 단일 책임 원칙을 따릅니다. 또한 시스템의 나머지 부분을 변경할 필요 없이 새로운 중재자를 도입할 수 있습니다. 따라서 공개 원칙을 따릅니다.

그러나 때때로 시스템의 잘못된 설계로 인해 단단히 결합된 물체가 너무 많을 수 있습니다. 이 경우 중재자 패턴을 적용해서는 안됩니다. 대신 한 걸음 물러서서 우리가 수업을 모델링 한 방식을 다시 생각해야 합니다.

다른 모든 패턴과 마찬가지로 , 중재자 패턴을 맹목적으로 구현하기 전에 특정 사용 사례를 고려해야 합니다.

 

 

샘플 보러 가기

https://github.com/qjatjr1108/DesignPattern

 

qjatjr1108/DesignPattern

DesignPattern Sample. Contribute to qjatjr1108/DesignPattern development by creating an account on GitHub.

github.com

 

'DesignPattern' 카테고리의 다른 글

[Design Pattern] Interpreter Pattern  (0) 2019.10.21
[Design Pattern] Iterator Pattern  (0) 2019.10.18
[Design Pattern] Memento Pattern  (0) 2019.10.17
[Design Pattern] Observer Pattern  (0) 2019.10.15
[Design Pattern] Strategy Pattern  (4) 2019.10.11

댓글