학습 목표

  • 복잡한 관계를 간단한 관계로 구현한다.
  • 객체 간 직접적인 의존도를 줄이는 것이 why 중요한지 이해한다
  • 미디에이터 패턴이 언제 필요한지 판단할 수 있다
  • 실서비스에서 적용할 수 있도록 예제 흐름 + 코드를 이해한다
  • 기존 구조와 비교해 장단점을 설명할 수 있다

상황 예제

  • 컴포넌트들이 서로 직접 참조하고 메시지를 주고받음
  • UI 컴포넌트가 서로 이벤트를 주고받음
  • 채팅방 기능 개발
    ⇒ N:N → N:1 관계로 개선

예제

더보기

유저를 연결해서 다른 유저한테 전체 메시지를 보내는 방법

  • Mediator (인터페이스) — 메시지 전달 규약 정의
public interface Mediator {
    void send(String message, Colleague colleague);
}
  • Colleague (추상 클래스)
public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public void send(String message) {
        mediator.send(message, this);
    }

    public abstract void receive(String message);
}
  • Concrete Mediator ( 실제 구현 클래스 )
public class ConcreteMediator implements Mediator{

    private List<Colleague> colleagues = new ArrayList<>();

    public void register(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void send(String message, Colleague sender) {
        for (Colleague c : colleagues) {
            if (c != sender) {
                c.receive(message);
            }
        }
    }
}
  • Concrete Colleague ( 구독 유저 정보 )
public class User extends Colleague {

    private String name;

    public User(Mediator mediator, String name) {
        super(mediator);
        this.name = name;
    }

    @Override
    public void receive(String message) {
        System.out.println(name + " received: " + message);
    }
}
  • 실행
public class Main {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();

        User user1 = new User(mediator, "Alice");
        User user2 = new User(mediator, "Bob");
        User user3 = new User(mediator, "Charlie");

        mediator.register(user1);
        mediator.register(user2);
        mediator.register(user3);

        user1.send("Hello everyone!");
    }
}

- 채팅방처럼 하나의 그룹으로 묶어서 메시지를 보내는 로직

 

마무리

상당히 쓰기 어려운 조건으로 만들어지는 것 같습니다. 그러나 동시에 1:N or N:N을 연결해서 서로 통신을 해야 하는 상황에서 많은 도움이 될 것 같아요.

+ Recent posts