본문 바로가기

Design Patterns/영문 위키(Wikipedia)

Mediator pattern

먼저 이 글은 영문 위키의 글을 번역한 글 임을 알려드립니다.

영어 실력이 부족한 관계로 오역이 있을 수도 있습니다.

원문 주소 : http://en.wikipedia.org/wiki/Mediator_pattern



Behavioral - Mediator pattern


mediator pattern은 한 집합의 객체들이 어떻게 상호작용하는지를 캡슐화 한 객체를 정의한다. 이 패턴은 프로그램이 동작하는 행위를 변경할 수 있기 때문에 behavioral pattern으로 간주된다.


보통 한 프로그램은 많은 클래스들(classes)로 만들어 진다. 그래서 논리(logic)계산(computation)이 이런 클래스들 사이에 분산되어 있다. 하지만 더 많은 클래스들이 만들어질수록 클래스들 간의 의사소통(communication) 문제는 더욱 복잡해진다.(특히 유지보수(maintenance)리펙토링(refactoring)을 할 때에는 더욱 더) 이러한 문제는 프로그램을 읽기 힘들게, 그리고 유지보수(maintain)하기 힘들게 만든다. 게다가, 이런 상황에서 약간의 코드 변화라도 다른 일부 클래스들에게 영향을 끼칠 수 있기 때문에 프로그램을 수정하는 게 어려워질 수 있다.


mediator 패턴을 이용하면, 객체간의 의사소통은 mediator객체에 의해 캡슐화 된다. 객체들은 더 이상 직접적으로 의사소통하지 않고, mediator를 통해서만 의사소통을 한다. 이렇게 함으로써 의사소통하는 객체들간의 의존도(dependencies)를 낮추고 따라서 coupling을 낮추게 된다.

정의 Definition

Mediator 패턴의 정수(essence)는 다음과 같다.

어떤 집합의 객체들이 어떻게 상호작용하는 가에 대해 캡슐화하는 객체를 정의하라. Mediator는 객체들이 서로 참조하지 못하도록 함으로써 낮은 커플링을 촉진시키고, 그 클래스들이 독립적으로 상호작용할 수 있도록 해준다.

참가자 Participants

Mediator - Colleague 객체들과 의사소통하기 위한 인터페이스를 정의한다.

ConcreteMediator - Mediator 인터페이스를 구현하고 Colleague 객체간의 의사소통을 조정한다. 이 클래스는 서로 의사소통하기 위해서 모든 Colleague와 그것의 목적을 다 알고 있다.

ConcreteColleague - Mediator를 통해서 다른 Colleague들과 의사소통한다.

예 Example

아래의 예에서 mediator 객체는 3개의 협력하는 버튼들의 상태를 조절한다.: 이렇게 상태를 조절하기 위해 mediator는 book(), view(), search() 메서더를 가진다. 이 3개의 메서드들은 각 버튼의 excute()메서드에 의해 호출된다. 

이로인해, 여기에서 협동 패턴은 각 참여자(버튼)가 mediator를 통해서 그들의 활동에 대해 의사소통하고, mediator는 다른 참가자에게 기대되는 행위를 전달한다.

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 IMediator {
    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 Mediator implements IMediator {
 
    BtnView btnView;
    BtnSearch btnSearch;
    BtnBook btnBook;
    LblDisplay show;
 
    //....
    void registerView(BtnView v) {
        btnView = v;
    }
 
    void registerSearch(BtnSearch s) {
        btnSearch = s;
    }
 
    void registerBook(BtnBook b) {
        btnBook = b;
    }
 
    void registerDisplay(LblDisplay d) {
        show = d;
    }
 
    void book() {
        btnBook.setEnabled(false);
        btnView.setEnabled(true);
        btnSearch.setEnabled(true);
        show.setText("booking...");
    }
 
    void view() {
        btnView.setEnabled(false);
        btnSearch.setEnabled(true);
        btnBook.setEnabled(true);
        show.setText("viewing...");
    }
 
    void search() {
        btnSearch.setEnabled(false);
        btnView.setEnabled(true);
        btnBook.setEnabled(true);
        show.setText("searching...");
    }
 
}
 
//A concrete colleague
class BtnView extends JButton implements Command {
 
    IMediator med;
 
    BtnView(ActionListener al, IMediator m) {
        super("View");
        addActionListener(al);
        med = m;
        med.registerView(this);
    }
 
    public void execute() {
        med.view();
    }
 
}
 
//A concrete colleague
class BtnSearch extends JButton implements Command {
 
    IMediator med;
 
    BtnSearch(ActionListener al, IMediator m) {
        super("Search");
        addActionListener(al);
        med = m;
        med.registerSearch(this);
    }
 
    public void execute() {
        med.search();
    }
 
}
 
//A concrete colleague
class BtnBook extends JButton implements Command {
 
    IMediator med;
 
    BtnBook(ActionListener al, IMediator m) {
        super("Book");
        addActionListener(al);
        med = m;
        med.registerBook(this);
    }
 
    public void execute() {
        med.book();
    }
 
}
 
class LblDisplay extends JLabel {
 
    IMediator med;
 
    LblDisplay(IMediator m) {
        super("Just start...");
        med = m;
        med.registerDisplay(this);
        setFont(new Font("Arial", Font.BOLD, 24));
    }
 
}
 
class MediatorDemo extends JFrame implements ActionListener {
 
    IMediator med = new Mediator();
 
    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();
    }
 
}




'Design Patterns > 영문 위키(Wikipedia)' 카테고리의 다른 글

Observer pattern  (0) 2012.06.27
Memento pattern  (0) 2012.06.20
Iterator pattern  (0) 2012.06.18
Interpreter pattern  (0) 2012.06.15
Command Pattern  (0) 2012.06.15