Skip to content

Latest commit

 

History

History
106 lines (78 loc) · 3.57 KB

File metadata and controls

106 lines (78 loc) · 3.57 KB

중재자 패턴은 객체간 커뮤니케이션을 하는 경우 중재자를 생성하여 객체끼리의 결합을 약화하는 디자인 패턴이다. 중재자 패턴을 사용하면 N:M개의 객체, 또는 N:1개의 객체간의 데이터 전달도 구현할 수 있다.

객체의 통신을 다룬다는 점에서 옵저버 패턴과 비슷하지만, 옵저버패턴은 한 객체에서 일방적으로 데이터를 송신하는데 반해 중재자패턴은 양방향으로 데이터를 전달할 수 있다는 것이 차이점이다.


예시 코드

@Getter
@Setter
public abstract class Colleague {

    protected String name;
    private Mediator mediator;
    private String message;

    public Colleague(String name) {
        this.name = name;
    }

    public void send() {
        System.out.println(this.name + " send()");
        mediator.mediate(this);
    }

    public abstract void receive(Colleague colleague);

}

public class ConcreteColleague extends Colleague{

    public ConcreteColleague(String name) {
        super(name);
    }

    @Override
    public void receive(Colleague colleague) {
        System.out.println(this.name + " received " + colleague.getName() + "'s Message : " + colleague.getMessage());
    }

}

다른 객체와 통신을 하는 Colleague를 만들었다. 하지만, Colleague가 직접 동신하지는 않고 Mediator를 거쳐야 통신할 수 있다.

public interface Mediator {
    void addColleague(Colleague colleague);
    void mediate(Colleague colleague);
}

public class ConcreteMediator implements Mediator {
    private final List<Colleague> colleagues = new ArrayList<>();

    @Override
    public void addColleague(Colleague colleague) {
        this.colleagues.add(colleague);
        colleague.setMediator(this);
    }

    @Override
    public void mediate(Colleague colleague) {
        for (Colleague receiverColleague : colleagues) {
            System.out.println("    Mediating " + colleague.getName() + " to " + receiverColleague.getName());
            receiverColleague.receive(colleague);
        }
    }
}

Mediator 클래스는 여러 컴포넌트를 통제해준다. Colleague를 list로 가지고있고 mediate()를 호출하면 그 Colleague들에게 메세지를 뿌려준다. 마치 SocketIo에서 socketIOServer.getRoomOperations().sendEvent();로 소켓 메세지를 전송하는 것과 같다...!

public class App {
    public static void main(String args[]) {
        Mediator mediator = new ConcreteMediator();
        Colleague colleague1 = new ConcreteColleague("User1");
        Colleague colleague2 = new ConcreteColleague("User2");

        mediator.addColleague(colleague1);
        mediator.addColleague(colleague2);

        colleague1.setMessage("Hello, world!");
        colleague1.send();
    }
}
//실행 결과
User1 send()
    Mediating User1 to User1
User1 received Message : Hello, world!
    Mediating User1 to User2
User2 received Message : Hello, world!

colleague1에서 mediator로 보낸 메세지가 mediator를 구독하고 있는 객체들에게 무사히 전달되는 것을 볼 수 있다.

이렇게 여러 객체간의 통신을 중재해주는 객체를 추가해줌으로써, 통신 객체 간 의존성을 줄여 결합도를 감소시키는 것이 중재자 패턴이었다.

링크로 가면 코드를 볼 수 있다.