본문 바로가기

JAVA/디자인 패턴

[Design Pattern] Mediator(중재자) 패턴이란?

반응형
행위 패턴(Behavioral Pattern)

 

중재자 패턴(Mediator Pattern)은 객체 지향 소프트웨어 디자인 패턴 중 하나로, 다수의 객체들 간의 상호작용을 조정하는 역할을 수행하는 객체를 정의합니다. 중재자 패턴은 객체들 간의 직접적인 상호작용을 제거함으로써, 객체 간 결합도를 낮추고 유지보수성을 향상시키는 장점을 제공합니다.

중재자 패턴은 일반적으로 다음과 같은 구성 요소로 이루어집니다.

 

  1. 중재자(Mediator) : 다수의 객체들 간의 상호작용을 조정하는 역할을 수행하는 객체입니다. 중재자는 객체 간의 직접적인 상호작용을 처리하고, 객체 간에 메시지를 전달합니다.

  2. 동료 객체(Colleague) : 중재자에 의해 관리되는 객체입니다. 동료 객체는 중재자와 상호작용하며, 다른 동료 객체와도 상호작용할 수 있습니다. 동료 객체는 중재자에 등록되어 상호작용을 처리할 수 있도록 합니다.

중재자 패턴은 다양한 상황에서 사용될 수 있습니다. 예를 들어, GUI 프로그램에서는 중재자 패턴을 사용하여 여러 컴포넌트들 간의 상호작용을 처리할 수 있습니다. 또한, 네트워크 프로그래밍에서도 중재자 패턴을 사용하여 서로 다른 컴퓨터 간의 통신을 조정할 수 있습니다.

중재자 패턴은 객체 지향 소프트웨어 디자인 패턴 중 하나이며, 객체 간 결합도를 낮추고 유지보수성을 향상시킬 수 있는 장점을 제공합니다.

 

 

Mediator 패턴 예제

예제는 간단한 채팅 프로그램을 구현하는 것입니다. 이 예제에서는 중재자(Mediator) 객체가 채팅방(ChatRoom)을 관리하고, 채팅방에 참여하는 사용자들이 동료(ChatUser) 객체입니다.

Diagrams


중재자 인터페이스

 

interface Mediator {
    void addUser(User user);
    void sendMessage(String message, User user);
}



채팅방 클래스

 

class ChatRoom implements Mediator {
    private List<User> users = new ArrayList<>();

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

    @Override
    public void sendMessage(String message, User user) {
        for (User u : users) {
            if (u != user) {
                u.receiveMessage(message);
            }
        }
    }
}



User 클래스

 

abstract class User {
    protected Mediator mediator;
    protected String name;

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

    public abstract void sendMessage(String message);
    public abstract void receiveMessage(String message);
}



Concrete User 클래스

 

class ChatUser extends User {
    public ChatUser(Mediator mediator, String name) {
        super(mediator, name);
    }

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

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



Client 클래스

 

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

        User user1 = new ChatUser(mediator, "User1");
        User user2 = new ChatUser(mediator, "User2");
        User user3 = new ChatUser(mediator, "User3");

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

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



위의 예제에서는 중재자 인터페이스 'Mediator'를 정의하고, 이를 구현한 채팅방 클래스 'ChatRoom'을 만듭니다. 사용자 클래스 'User'는 추상 클래스로 정의되며, 구체적인 사용자 클래스 'ChatUser'는 'User' 클래스를 상속받아 구현됩니다.

'ChatRoom' 클래스는 'addUser()' 메서드와 'sendMessage()' 메서드를 구현합니다. 'addUser()' 메서드는 채팅방에 사용자를 추가하는 역할을 합니다. `sendMessage()` 메서드는 채팅방에 있는 모든 사용자에게 메시지를 전달하는 역할을 합니다.

'ChatUser' 클래스는 'sendMessage()' 메서드와 'receiveMessage()' 메서드를 구현합니다. 'sendMessage()' 메서드는 해당 사용자가 보낸 메시지를 출력하고, 'Mediator' 인터페이스의 'sendMessage()' 메서드를 호출하여 채팅방에 있는 모든 사용자에게 메시지를 전달합니다. 'receiveMessage()' 메서드는 해당 사용자가 받은 메시지를 출력합니다.

'Main' 클래스는 예제를 실행하는 클래스입니다. `main()` 메서드에서는 채팅방 객체를 생성하고, 사용자 객체를 생성한 후 채팅방에 추가합니다. 마지막으로 'user1' 객체가 'sendMessage()' 메서드를 호출하여 메시지를 보냅니다. 이 때, 중재자 객체 'ChatRoom'의 'sendMessage()' 메서드가 호출되어 채팅방에 있는 모든 사용자에게 메시지가 전달됩니다.

실행 결과는 다음과 같습니다.

User1 : Hello, everyone!
User2 received : Hello, everyone!
User3 received : Hello, everyone!



이 예제에서는 중재자 패턴을 사용하여 채팅방을 구현하였습니다. 채팅방 객체는 채팅방에 참여하는 사용자 객체들의 관리와 메시지 전달을 중재하는 역할을 합니다. 사용자 객체들은 서로 동료 객체이며, 채팅방 객체를 통해 메시지를 전달받습니다. 이렇게 중재자 패턴을 사용하면 객체간의 결합도가 낮아져 유연한 구조를 만들 수 있습니다.

반응형