Mediator (중재자) 패턴. 클래스의 복잡도가 증가하면 중재자를 만들어 구현. 

 객체간의 M:N 관계를 중재자를 두어 1:1로 만들어준다.

 장점 : 객체간의 관계 코드가 중재자 클래스안에 집중됨으로 관리가 편해진다.

 ex)통보센터는 잘 만들어진 중재자 패턴의 예이다.


  1. interface IMediator {
  2.         void sendEvent(String name, String event);
  3. }
  4.  
  5. class Mediator implements IMediator {
  6.         private List<Colleague> colleagues = new ArrayList<>();
  7.  
  8.         public Mediator() {
  9.         }
  10.  
  11.         public void addColleague(Colleague a) {
  12.                 a.setMediator(this);
  13.                 colleagues.add(a);
  14.         }
  15.  
  16.         @Override
  17.         public void sendEvent(String name, String event) {
  18.                 for (Colleague s : colleagues) {
  19.                         if (s.getName() == name) {
  20.                                 s.receiveEvent(name, event);
  21.                         }
  22.                 }
  23.                 // 기존의 복잡성 증가의 코드
  24.                 // switch (name) {
  25.                 // case "A":
  26.                 // a.receiveEvent(name, event);
  27.                 // break;
  28.                 // case "B":
  29.                 // b.receiveEvent(name, event);
  30.                 // break;
  31.                 // case "C":
  32.                 // c.receiveEvent(name, event);
  33.                 // break;
  34.                 // }
  35.         }
  36.  
  37. }
  38.  
  39. // GoF 의 패턴에서는 A,B,C를 협력자 (Colleague)라는 용어로 지칭한다.
  40. abstract class Colleague {
  41.         public IMediator mediator;
  42.  
  43.         public void setMediator(IMediator im) {
  44.                 this.mediator = im;
  45.         }
  46.  
  47.         public void sendEvent(String name, String event) {
  48.                 mediator.sendEvent(name, event);
  49.         }
  50.  
  51.         abstract public void fireEvent(String event);
  52.  
  53.         abstract public void receiveEvent(String name, String event);
  54.  
  55.         abstract public String getName();
  56. }
  57.  
  58. class A extends Colleague {
  59.         String name = "A";
  60.  
  61.         public void fireEvent(String event) {
  62.                 mediator.sendEvent(name, event);
  63.         }
  64.  
  65.         public void receiveEvent(String name, String event) {
  66.                 System.out.println("Receive event from " + name);
  67.         }
  68.  
  69.         public String getName() {
  70.                 return name;
  71.         }
  72. }
  73.  
  74. class B extends Colleague {
  75.         String name = "B";
  76.  
  77.         public void fireEvent(String event) {
  78.                 mediator.sendEvent(name, event);
  79.         }
  80.  
  81.         public void receiveEvent(String name, String event) {
  82.                 System.out.println("Receive event from " + name);
  83.         }
  84.  
  85.         public String getName() {
  86.                 return name;
  87.         }
  88. }
  89.  
  90. class C extends Colleague {
  91.         String name = "C";
  92.  
  93.         public void fireEvent(String event) {
  94.                 mediator.sendEvent(name, event);
  95.         }
  96.  
  97.         public void receiveEvent(String name, String event) {
  98.                 System.out.println("Receive event from " + name);
  99.         }
  100.  
  101.         public String getName() {
  102.                 return name;
  103.         }
  104. }
  105.  
  106. public class Ex2 {
  107.  
  108.         public static void main(String[] args) {
  109.                 A a = new A();
  110.                 B b = new B();
  111.                 C c = new C();
  112.  
  113.                 Mediator m = new Mediator();
  114.                 m.addColleague(a);
  115.                 m.addColleague(b);
  116.                 m.addColleague(c);
  117.  
  118.                 m.sendEvent("B""Hello");
  119.                 a.fireEvent("ReceiveMail");
  120.         }
  121.  
  122. }


'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

+ Recent posts