중재자 패턴은 객체 간의 상호 작용을 캡슐화하여 객체 간의 직접적인 통신을 방지하고, 중재자 역할을 통해 간접적으로 통신하도록 하는 디자인 패턴이다. 객체 간의 통신 로직을 중재자에게 넘겨 결합도를 낮춘다.
구성 요소
- Mediator(중재자):
- 객체 간의 통신을 총괄하며, 객체들 간의 상호 작용을 조정한다. 중재자 인터페이스를 통해 통신 규약을 정의하고, 구체적인 중재자 클래스가 이를 구현한다.
- ConcreteMediator(구체적인 중재자):
- Mediator 인터페이스를 구현하며, 객체 간의 상호 작용을 조정한다. 각 객체가 중재자를 참조하여 통신을 진행한다.
- Colleague(협력자):
- 중재자와 통신하는 객체를 나타내며, Mediator에 등록된다. 각 협력자는 중재자를 통해 다른 협력자와 통신한다.
- 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");
}
}
728x90
'디자인 패턴' 카테고리의 다른 글
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 |