본문 바로가기
Design Pattern/행동 패턴(Behavioral Patterns)

중재자(Mediator) - 행동 패턴(Behavioral Patterns)

by 김 민 준 2024. 5. 25.

 

중재자 패턴은 개체들이 직접 통신하지 않고 중재자 개체를 통해 통신하도록하는 디자인패턴이다. 개체간의 상호작용을 캡슐화 하여 개체간의 결합도를 줄이고, 개체간의 상호작용을 한 곳에서 관리할 수 있도록 한다.

 

주요 개념 부터 살펴보자

 

1. Mediator (중재자) : 개체 간의 상호 작용을 조정하는 인터페이스를 정의한다.

2. ConcreteMediator (구체적인 중재자) : Mediator 인터페이스를 구현하며, 개체간의 상호작용을 실제로 조정한다.

3. Colleague (동료개체) : 상호작용하는 개체들로, 중재자와 상호작용한다.

4. ConcreteColleague (구체적인 동료 개체) : Colleague 인터페이스를 구현하며, 중재자를 통해 다른 개체들과 통신한다.

 

중재자 패턴이 가장 많이 쓰이는 채팅 시스템 소스코드를 살펴보자.

 

 

// Mediator 인터페이스: 객체 간의 상호작용을 조정하는 메서드를 정의
interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}

 

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

// ConcreteMediator 클래스: Mediator 인터페이스를 구현하며, 객체 간의 상호작용을 조정
class ChatMediatorImpl implements ChatMediator {
    private List<User> users;

    public ChatMediatorImpl() {
        this.users = new ArrayList<>();
    }

    @Override
    public void addUser(User user) {
        this.users.add(user);
    }

    @Override
    public void sendMessage(String message, User user) {
        for (User u : this.users) {
            // 메시지를 보낸 사용자가 아닌 다른 사용자에게 메시지를 전달
            if (u != user) {
                u.receive(message);
            }
        }
    }
}

 

// Colleague 클래스: Mediator와 상호작용하는 기본 클래스
abstract class User {
    protected ChatMediator mediator;
    protected String name;

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

    public abstract void send(String message);
    public abstract void receive(String message);
}

 

// ConcreteColleague 클래스: Colleague 클래스의 구체적인 구현
class UserImpl extends User {
    public UserImpl(ChatMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println(this.name + " sends: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println(this.name + " receives: " + message);
    }
}

 

// Client 클래스: 중재자와 동료 객체들을 설정하고, 메시지를 주고받음
public class MediatorPatternDemo {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatMediatorImpl();

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

        mediator.addUser(user1);
        mediator.addUser(user2);
        mediator.addUser(user3);
        mediator.addUser(user4);

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

 

//출력

//Alice sends: Hello, everyone!
//Bob receives: Hello, everyone!
//Charlie receives: Hello, everyone!
//Dave receives: Hello, everyone!

 

소스코드와 같이 중재자 패턴을 이용하여 채팅이나 모듈간 상호작용이 필요한 부분을 구현할 수 있다.

 

이렇게 중재자 패턴을 사용하게되면 상호작용을 한곳에서 관리할 수 있어 유지보수와 확장성에 유리하며, 복잡한 시스템에서 개체간의 결합도를 줄이고 각 개체가 독립적으로 동작할 수 있어 유연성을 높일 수 있다.