**중재자 패턴**(mediator pattern), **조정자 패턴**은 소프트웨어 공학에서 어떻게 객체들의 집합이 상호작용하는지를 함축해놓은 객체를 정의한다. 이 패턴은 프로그램의 실행 행위를 변경할 수 있기 때문에 행위 패턴으로 간주된다.

중재자 패턴을 사용하면 객체 간 통신은 중재자 객체 안에 함축된다. 객체들은 더 이상 다른 객체와 서로 직접 통신하지 않으며 대신 중재자를 통해 통신한다. 이를 통해 통신 객체 간 의존성을 줄일 수 있으므로 결합도를 감소시킨다.

개요
--

중재자 디자인 패턴은 유연하고 재사용 가능한 객체 지향 소프트웨어를 설계하기 위해 반복되는 디자인 문제를 해결하는 방법, 즉 객체는 구현, 변경, 테스트, 재사용이 쉬워야 한다는 것을 기술하는, 잘 알려진 23가지 GoF 디자인 패턴들 중 하나이다.

구조
--

### UML 클래스 및 시퀀스 다이어그램

중재자 디자인 패턴을 위한 샘플 UML 클래스와 시퀀스 다이어그램.
### 클래스 다이어그램

중재자 행위 디자인 패턴

예시
--

### 자바

```
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

//Colleague interface
interface Command {
 void execute();
}

//Abstract Mediator
interface Mediator {
 void book();
 void view();
 void search();
 void registerView(BtnView v);
 void registerSearch(BtnSearch s);
 void registerBook(BtnBook b);
 void registerDisplay(LblDisplay d);
}

//Concrete mediator
class ParticipantMediator implements Mediator {

 BtnView btnView;
 BtnSearch btnSearch;
 BtnBook btnBook;
 LblDisplay show;

 //....
 public void registerView(BtnView v) {
 btnView = v;
 }

 public void registerSearch(BtnSearch s) {
 btnSearch = s;
 }

 public void registerBook(BtnBook b) {
 btnBook = b;
 }

 public void registerDisplay(LblDisplay d) {
 show = d;
 }

 public void book() {
 btnBook.setEnabled(false);
 btnView.setEnabled(true);
 btnSearch.setEnabled(true);
 show.setText("booking...");
 }

 public void view() {
 btnView.setEnabled(false);
 btnSearch.setEnabled(true);
 btnBook.setEnabled(true);
 show.setText("viewing...");
 }

 public void search() {
 btnSearch.setEnabled(false);
 btnView.setEnabled(true);
 btnBook.setEnabled(true);
 show.setText("searching...");
 }

}

//A concrete colleague
class BtnView extends JButton implements Command {

 Mediator med;

 BtnView(ActionListener al, Mediator m) {
 super("View");
 addActionListener(al);
 med = m;
 med.registerView(this);
 }

 public void execute() {
 med.view();
 }

}

//A concrete colleague
class BtnSearch extends JButton implements Command {

 Mediator med;

 BtnSearch(ActionListener al, Mediator m) {
 super("Search");
 addActionListener(al);
 med = m;
 med.registerSearch(this);
 }

 public void execute() {
 med.search();
 }

}

//A concrete colleague
class BtnBook extends JButton implements Command {

 Mediator med;

 BtnBook(ActionListener al, Mediator m) {
 super("Book");
 addActionListener(al);
 med = m;
 med.registerBook(this);
 }

 public void execute() {
 med.book();
 }

}

class LblDisplay extends JLabel {

 Mediator med;

 LblDisplay(Mediator m) {
 super("Just start...");
 med = m;
 med.registerDisplay(this);
 setFont(new Font("Arial", Font.BOLD, 24));
 }

}

class MediatorDemo extends JFrame implements ActionListener {

 Mediator med = new ParticipantMediator();

 MediatorDemo() {
 JPanel p = new JPanel();
 p.add(new BtnView(this, med));
 p.add(new BtnBook(this, med));
 p.add(new BtnSearch(this, med));
 getContentPane().add(new LblDisplay(med), "North");
 getContentPane().add(p, "South");
 setSize(400, 200);
 setVisible(true);
 }

 public void actionPerformed(ActionEvent ae) {
 Command comd = (Command) ae.getSource();
 comd.execute();
 }

 public static void main(String[] args) {
 new MediatorDemo();
 }

}

```