디자인 패턴

Mediator Pattern

kyoulho 2024. 5. 28. 21:33

중재자 패턴은 객체 간의 상호 작용을 캡슐화하여 객체 간의 직접적인 통신을 방지하고, 중재자 역할을 통해 간접적으로 통신하도록 하는 디자인 패턴이다. 객체 간의 통신 로직을 중재자에게 넘겨 결합도를 낮춘다.

구성 요소

  1. Mediator(중재자):
    • 객체 간의 통신을 총괄하며, 객체들 간의 상호 작용을 조정한다. 중재자 인터페이스를 통해 통신 규약을 정의하고, 구체적인 중재자 클래스가 이를 구현한다.
  2. ConcreteMediator(구체적인 중재자):
    • Mediator 인터페이스를 구현하며, 객체 간의 상호 작용을 조정한다. 각 객체가 중재자를 참조하여 통신을 진행한다.
  3. Colleague(협력자):
    • 중재자와 통신하는 객체를 나타내며, Mediator에 등록된다. 각 협력자는 중재자를 통해 다른 협력자와 통신한다.
  4. ConcreteColleague(구체적인 협력자):
    • Colleague 인터페이스를 구현하며, 중재자와 통신하면서 필요한 동작을 수행한다.

장점

  • 시스템과 객체를 분리함으로써 재사용성을 획기적으로 향상할 수 있다.
  • 제어 로직을 한 군데 모아놨으므로 관리하기가 수월하다.
  • 시스템에 들어있는 객체 사이에서 오가는 메시지를 확 줄이고 단순화할 수 있다.
  • 서로 연관된 GUI 구성 요소를 관리하는 용도로 많이 쓰인다.

단점

  • 디자인을 잘 하지 못하면 중재자 객체가 너무 복잡해질 수 있다.

예제

Mediator 패턴을 사용하여 Colleague 객체 간의 통신을 중앙에서 관리하는 방식으로 구현된 예제이다.

// Colleague 인터페이스: 모든 Colleague 클래스가 구현해야 하는 인터페이스
interface Colleague {
    void receive(String message);  // 메시지를 받는 메서드
    void send(String message);     // 메시지를 보내는 메서드
}

// Mediator 인터페이스: Colleague 객체 간의 통신을 조정하는 인터페이스
interface ComputerMediator {
    void add(Colleague colleague);   // 새로운 Colleague를 추가하는 메서드
    void send(String message, Colleague colleague); // 특정 Colleague로부터 메시지를 받아 다른 Colleague에 전달하는 메서드
}

// ConcreteColleague 클래스: Colleague 인터페이스를 구현한 CPU 클래스
class CPU implements Colleague {
    private final ComputerMediator mediator;

    // 생성자: mediator를 주입받음
    public CPU(ComputerMediator mediator) {
        this.mediator = mediator;
    }

    // 메시지를 받는 메서드의 구현
    @Override
    public void receive(String message) {
        System.out.println("CPU received: " + message);
    }

    // 메시지를 보내는 메서드의 구현
    @Override
    public void send(String message) {
        System.out.println("CPU sending: " + message);
        mediator.send(message, this);
    }
}

// ConcreteColleague 클래스: Colleague 인터페이스를 구현한 GraphicsCard 클래스
class GraphicsCard implements Colleague {
    private final ComputerMediator mediator;

    // 생성자: mediator를 주입받음
    public GraphicsCard(ComputerMediator mediator) {
        this.mediator = mediator;
    }

    // 메시지를 받는 메서드의 구현
    @Override
    public void receive(String message) {
        System.out.println("Graphics Card received: " + message);
    }

    // 메시지를 보내는 메서드의 구현
    @Override
    public void send(String message) {
        System.out.println("Graphics Card sending: " + message);
        mediator.send(message, this);
    }
}

// ConcreteColleague 클래스: Colleague 인터페이스를 구현한 Memory 클래스
class Memory implements Colleague {
    private final ComputerMediator mediator;

    // 생성자: mediator를 주입받음
    public Memory(ComputerMediator mediator) {
        this.mediator = mediator;
    }

    // 메시지를 받는 메서드의 구현
    @Override
    public void receive(String message) {
        System.out.println("Memory received: " + message);
    }

    // 메시지를 보내는 메서드의 구현
    @Override
    public void send(String message) {
        System.out.println("Memory sending: " + message);
        mediator.send(message, this);
    }
}

// ConcreteMediator 클래스: ComputerMediator 인터페이스를 구현한 클래스
class ConcreteMediator implements ComputerMediator {
    List<Colleague> colleagues;  // Colleague 객체들을 저장할 리스트

    // 생성자: colleagues 리스트를 초기화
    public ConcreteMediator() {
        this.colleagues = new ArrayList<>();
    }

    // 새로운 Colleague를 리스트에 추가하는 메서드의 구현
    @Override
    public void add(Colleague colleague) {
        this.colleagues.add(colleague);
    }

    // 메시지를 받아서 각 Colleague에 전달하는 메서드의 구현
    @Override
    public void send(String message, Colleague sender) {
        for (Colleague colleague : colleagues) {
            // 메시지를 보내는 Colleague를 제외한 모든 Colleague에게 메시지를 전달
            if (!colleague.equals(sender)) {
                colleague.receive(message);
            }
        }
    }
}

// 클라이언트 코드: Mediator 패턴을 사용하는 예제
public class Client {
    public static void main(String[] args) {
        // Mediator 객체 생성
        ComputerMediator mediator = new ConcreteMediator();

        // Colleague 객체 생성 및 Mediator에 추가
        Colleague cpu = new CPU(mediator);
        Colleague memory = new Memory(mediator);
        Colleague graphicsCard = new GraphicsCard(mediator);

        mediator.add(cpu);
        mediator.add(memory);
        mediator.add(graphicsCard);

        // CPU가 메시지를 보내고, 다른 Colleague 객체들이 메시지를 받음
        cpu.send("Data to process");
    }
}

'디자인 패턴' 카테고리의 다른 글

Proxy Pattern  (0) 2024.06.15
Observer Pattern  (0) 2024.05.30
Iterator Pattern  (0) 2024.05.27
Flyweight Pattern  (0) 2024.05.25
Factory Pattern  (0) 2024.05.18