아무거나

[Design Pattern] Mediator Pattern 본문

Java & Kotlin/Java

[Design Pattern] Mediator Pattern

전봉근 2020. 1. 8. 00:02
반응형

중재자 패턴(Mediator Pattern)

모든 클래스간의 복잡한 로직(상호작용)을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴(M:N 관계를 1:1로 변경)

 

 

  • 문자
    • 1:N 으로 되므로 커뮤니케이션이 불편하다.
    • 예를 들어 약속을 잡을때도 A, B, C, D 의 사람이 있다고하면 B는 약속이되고 C는 약속이 안되고 D도 약속이 안되는 등 제각각으로 연락해야하며 한명이 전체적인 의견을 한명씩 연락하여 물어봐야하므로 복잡하다.
  • 그룹채팅
    • 중간에 매개체가 있으로 커뮤니케이션에 용이하다.

아래는 해당 패턴의 기본 설계이다.

 

 

위의 굵게 표시된 부분은 우리가 직접 구현해야하고 그렇지 않은 부분은 추상클래스로 구현

  • Mediator 에서는 협력해서 일하는 사람들 즉, 그 객체들을 담는 그릇이 있다. (=colleagues)
  • Colleague 에서 colleagues는 mediator을 알아야하고 mediator또한 colleagues을 알아야 어떤 일이일어날지 각각에게 알려줄 수 있다.
  • Mediator 에서는 같이 일하는 colleague를 넣을 수 있는 함수가 필요하다.(=addColleague) 해당 함수를 통해서 colleagues 목록에 담길 수 있다.
  • Colleague 에는 어떤 mediator에 등록될지 정하는 함수가 필요하다.(=registerMediator)
  • Colleague 에 어떤 일이 발생하였을때 Mediator에게 알려준다. (send, handle)

중재자 패턴 예시 - 1

먼저 contract 패키지를 추가하고 패키지안에 추상클래스를 추가하자.(Colleague, Mediator)
[Colleague.java]

package com.bkjeon.mediator.contract;

public abstract class Colleague {

    private Mediator mediator;

    public boolean join(Mediator mediator) {
        if (mediator == null) {
            return false;
        }
        this.mediator = mediator;
        return mediator.addColleague(this);
    }

    public void sendData(String data) {
        if (mediator != null) {
            mediator.mediate(data);
        }
    }

    abstract public void handle(String data);

}

[Mediator.java]

package com.bkjeon.mediator.contract;

import java.util.ArrayList;
import java.util.List;

public abstract class Mediator {

    protected List<Colleague> colleagues;

    public Mediator() {
        colleagues = new ArrayList<>();
    }

    public boolean addColleague(Colleague colleague) {
        if (colleagues != null) {
            return colleagues.add(colleague);
        } else {
            return false;
        }
    }

    public abstract void mediate(String data);

}

메세지 관련된 클래스들을 구현하자.(ChatMediator, ChatColleague)
[ChatMediator.java]

package com.bkjeon.mediator;

import com.bkjeon.mediator.contract.Colleague;
import com.bkjeon.mediator.contract.Mediator;

public class ChatMediator extends Mediator {
    @Override
    public void mediate(String data) {
        for (Colleague colleague : colleagues) {
            // 중재가능성 ( ex: 누구한테만 보낼지 안보낼지, 시간에 따라 다르게 보낼지, 두번 보낼지 등.. )
            colleague.handle(data);
        }
    }
}

[ChatColleague.java]

package com.bkjeon.mediator;

import com.bkjeon.mediator.contract.Colleague;

public class ChatColleague extends Colleague {
    @Override
    public void handle(String data) {
        System.out.println(this + "-" + data);
    }
}

메인 함수를 구현하자.
[Main.java]

package com.bkjeon.mediator;

import com.bkjeon.mediator.contract.Colleague;
import com.bkjeon.mediator.contract.Mediator;

public class Main {

    public static void main(String[] args) {
        Mediator mediator = new ChatMediator();

        Colleague colleague1 = new ChatColleague();
        Colleague colleague2 = new ChatColleague();
        Colleague colleague3 = new ChatColleague();

        colleague1.join(mediator);
        colleague2.join(mediator);
        colleague3.join(mediator);

        colleague1.sendData("AAA");
        colleague2.sendData("BBB");
        colleague3.sendData("CCC");
    }

}

실행결과

com.bkjeon.mediator.ChatColleague@4f3f5b24-AAA
com.bkjeon.mediator.ChatColleague@15aeb7ab-AAA
com.bkjeon.mediator.ChatColleague@7b23ec81-AAA
com.bkjeon.mediator.ChatColleague@4f3f5b24-BBB
com.bkjeon.mediator.ChatColleague@15aeb7ab-BBB
com.bkjeon.mediator.ChatColleague@7b23ec81-BBB
com.bkjeon.mediator.ChatColleague@4f3f5b24-CCC
com.bkjeon.mediator.ChatColleague@15aeb7ab-CCC
com.bkjeon.mediator.ChatColleague@7b23ec81-CCC

위의 메인함수를 보면 colleague들이 어떤 mediator에 join 되어있고 데이터를 보내면은 mediator가 받고 colleague들이 같이 주고받는 형태가된다.

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

 

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

[Design Pattern] Memento Pattern  (0) 2020.01.12
[Design Pattern] State Pattern  (0) 2020.01.10
[Design Pattern] Observer Pattern  (0) 2020.01.05
[Design Pattern] Facade Pattern  (0) 2020.01.04
[Design Pattern] Chain of Responsibility Pattern  (0) 2020.01.04
Comments