什么是中介者模式

中介者模式是一种行为型模式。它把原来多对多的关系抽象成一对多的关系。

中介者模式的结构

  • Mediator:抽象中介者

  • ConcreteMediator:具体中介者

  • Colleague:抽象同事类

  • ConcreteColleagueA:具体同事类A

  • ConcreteColleagueB:具体同事类B

中介者模式的一个实例

一个简单的面板,面板上的元素有文本(LblDisplay)和三个按钮。三个按钮分别为BtnBook、BtnSearch和BtnView. 每当按下其中的某个按钮时,按下的按钮置成不可再点击状态,其他的两个按钮置成可点击状态。另外文本也显示相对应的文本。

实例代码

Command

public interface Command {
    void execute();
}

LblDisplay

import javax.swing.*;
import java.awt.*;

public class LblDisplay extends JLabel {
    Mediator med;

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

BtnBook

import javax.swing.*;
import java.awt.event.ActionListener;

public 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();
    }
}

BtnSearch

import javax.swing.*;
import java.awt.event.ActionListener;

public 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();
    }
}

BtnView

import javax.swing.*;
import java.awt.event.ActionListener;

public 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();
    }
}

Mediator

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

PaticipantMediator

public 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...");
    }
}

MediatorDemo

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public 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();
    }
}

实例结果

(完)