@634

Mediator パターン

Advertisement

調停者

Mediator(調停者)が全体を一括して取りまとめる。

たとえば「ボタンAを押下するとテキストボックスAとテキストボックスBが入力不可能になる」という動作を実装する場合、
ボタンAを押下→調停者に押下されたことを通知→調停者が各テキストボックスに入力不可能にすることを通知。
という動作の流れになる。

GUI アプリケーション構築に適用しやすい。

サンプルコード (MediatorPattern.java)
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class MediatorPattern {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame("Mediator Test");
    }
}

class MyFrame extends JFrame implements Mediator{
    JCheckBox checkJava;
    JCheckBox checkCpp;
    JCheckBox checkCobol;
    JCheckBox checkBlue;
    JCheckBox checkRed;
    JCheckBox checkGreen;

    public MyFrame(String caption){
        super(caption);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MyButton buttonProgram = new MyButton("Program");
        MyButton buttonColor = new MyButton("Color");

        // 各部品に調停者を知らせる
        buttonProgram.addMediator(this);
        buttonColor.addMediator(this);

        checkJava = new JCheckBox("Java");
        checkCpp = new JCheckBox("C++");
        checkCobol = new JCheckBox("COBOL");
        checkBlue = new JCheckBox("青");
        checkRed = new JCheckBox("赤");
        checkGreen = new JCheckBox("緑");

        JPanel parentPanel = new JPanel();
        parentPanel.add(buttonProgram);
        parentPanel.add(buttonColor);

        JPanel childPanel = new JPanel();
        childPanel.add(checkJava);
        childPanel.add(checkCpp);
        childPanel.add(checkCobol);
        childPanel.add(checkBlue);
        childPanel.add(checkRed);
        childPanel.add(checkGreen);

        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(parentPanel, "North");
        this.getContentPane().add(childPanel, "South");

        this.pack();
        this.setVisible(true);
    }

    //Mediator の役割。各部品に状態を指示する
    public void stateChanged(ActionEvent e){
        if(e.getActionCommand() == "Program"){
            checkJava.setEnabled(true);
            checkCpp.setEnabled(true);
            checkCobol.setEnabled(true);
            checkBlue.setEnabled(false);
            checkRed.setEnabled(false);
            checkGreen.setEnabled(false);
        }else{
            checkJava.setEnabled(false);
            checkCpp.setEnabled(false);
            checkCobol.setEnabled(false);
            checkBlue.setEnabled(true);
            checkRed.setEnabled(true);
            checkGreen.setEnabled(true);
        }
    }

}

// Mediatorインタフェース。
interface Mediator{
    public abstract void stateChanged(ActionEvent e);
}

// Mediator に取りまとめられる側のボタン。
class MyButton extends JButton implements ActionListener{
    private Mediator mediator;
    public MyButton(String caption){
        super(caption);
        addActionListener(this);
    }

    public void addMediator(Mediator mediator){
        this.mediator = mediator;
    }

    public void actionPerformed(ActionEvent e){
        mediator.stateChanged(e);
    }
}

実行結果

1回のボタン押下に対して、3つのコンポーネントの状態を変化させる。

クラス図

Mediator

Advertisement

ショートカット

634
634ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール

ビリヤード