Mediator (중재자) 패턴. 클래스의 복잡도가 증가하면 중재자를 만들어 구현.
객체간의 M:N 관계를 중재자를 두어 1:1로 만들어준다.
장점 : 객체간의 관계 코드가 중재자 클래스안에 집중됨으로 관리가 편해진다.
ex)통보센터는 잘 만들어진 중재자 패턴의 예이다.
- interface IMediator {
- void sendEvent(String name, String event);
- }
- class Mediator implements IMediator {
- private List<Colleague> colleagues = new ArrayList<>();
- public Mediator() {
- }
- public void addColleague(Colleague a) {
- a.setMediator(this);
- colleagues.add(a);
- }
- @Override
- public void sendEvent(String name, String event) {
- for (Colleague s : colleagues) {
- if (s.getName() == name) {
- s.receiveEvent(name, event);
- }
- }
- // 기존의 복잡성 증가의 코드
- // switch (name) {
- // case "A":
- // a.receiveEvent(name, event);
- // break;
- // case "B":
- // b.receiveEvent(name, event);
- // break;
- // case "C":
- // c.receiveEvent(name, event);
- // break;
- // }
- }
- }
- // GoF 의 패턴에서는 A,B,C를 협력자 (Colleague)라는 용어로 지칭한다.
- abstract class Colleague {
- public IMediator mediator;
- public void setMediator(IMediator im) {
- this.mediator = im;
- }
- public void sendEvent(String name, String event) {
- mediator.sendEvent(name, event);
- }
- abstract public void fireEvent(String event);
- abstract public void receiveEvent(String name, String event);
- abstract public String getName();
- }
- class A extends Colleague {
- String name = "A";
- public void fireEvent(String event) {
- mediator.sendEvent(name, event);
- }
- public void receiveEvent(String name, String event) {
- System.out.println("Receive event from " + name);
- }
- public String getName() {
- return name;
- }
- }
- class B extends Colleague {
- String name = "B";
- public void fireEvent(String event) {
- mediator.sendEvent(name, event);
- }
- public void receiveEvent(String name, String event) {
- System.out.println("Receive event from " + name);
- }
- public String getName() {
- return name;
- }
- }
- class C extends Colleague {
- String name = "C";
- public void fireEvent(String event) {
- mediator.sendEvent(name, event);
- }
- public void receiveEvent(String name, String event) {
- System.out.println("Receive event from " + name);
- }
- public String getName() {
- return name;
- }
- }
- public class Ex2 {
- public static void main(String[] args) {
- A a = new A();
- B b = new B();
- C c = new C();
- Mediator m = new Mediator();
- m.addColleague(a);
- m.addColleague(b);
- m.addColleague(c);
- m.sendEvent("B", "Hello");
- a.fireEvent("ReceiveMail");
- }
- }
'java > design_pattern' 카테고리의 다른 글
Visitor Pattern - 방문자 패턴 (0) | 2014.07.01 |
---|---|
Chain of Responsibility Pattern - 책임의 전가 (0) | 2014.07.01 |
ObserverPattern - 관찰자 패턴 (0) | 2014.07.01 |
Factory method pattern (0) | 2014.06.27 |
Flyweight Pattern (0) | 2014.06.27 |