Mediator 中介模式

来源:互联网 发布:种族问题 知乎 编辑:程序博客网 时间:2024/04/28 14:01

模式定义

 

使用一个中介对象来封装一系列对象之间的交互。中介者可以独立开这些对象之间的相互引用,使其耦合松散,并可以改变他们之间的交互。

使用方法

 

一系列的对象向中介注册,将他们之间的相互耦合关系交由中介统一管理。

使用范围

 

  • 对象之间相互引用且逻辑过于复杂的时候。
  • 当引入一个新的对象后导致其他已存在的对象需要重新改变相互之间的逻辑的时候。
  • 特别适合事件驱动类的程序中,例如界面动作。

举例说明

 

创捷一个应用程序,该程序具有Calculate计算的功能,同时,能Halt中断计算,或者直接停止计算。Calculate、Halt、Stop三种功能分别通过点击三个按钮来完成动作。当点击其中一个按钮时,该按钮被Disable,而其他可Enable。比如点击Calculate的时候,Calculate的按钮灰掉不可再点击,而Halt和Stop可以点击。

首先定义一个Command的接口,表示按钮要执行的动作。各个按钮将实现该接口的execute方法。

public interface Command {    void execute();}

接下来定义各个按钮:BtnCalculate、BtnHalt、BtnStop。注意到每个类都向Mediator注册并交由Mediator管理具体的动作。这三个类没有直接的相互引用,完全松耦合。

public class BtnCalculate extends JButton implements Command {    Mediator med;    BtnCalculate (ActionListener al, Mediator m) {        super("Calculate");        addActionListener(al);        med = m;        med.registerCalculate(this);    }    public void execute() {       med.cal();    }}---------public class BtnHalt extends JButton implements Command {    Mediator med;    BtnHalt(ActionListener al, Mediator m) {        super("Halt");        addActionListener(al);        med = m;        med.registerHalt(this);    }    public void execute() {       med.halt();    }}---------public class BtnStop extends JButton implements Command {    Mediator med;    BtnStop(ActionListener al, Mediator m) {        super("Stop");        addActionListener(al);        med = m;        med.registerStop(this);    }    public void execute() {       med.stop();    }}

再看Mediator如何注册这三个类并管理他们直接的具体Command和相互之间的关系。注册registerXXXX引用了他们三个类的一个实例。并代理他们实现command方法。

public class Mediator {    BtnCalculate btnCal;    BtnHalt btnHalt;    BtnStop btnStop;    LblDisplay show;    //....    void registerCalculate(BtnCalculate c) {    btnCal = c;    }    void registerHalt(BtnHalt h) {    btnHalt = h;    }    void registerStop(BtnStop s) {    btnStop = s;    }    void registerDisplay(LblDisplay d) {        show = d;    }    void cal() {    btnCal.setEnabled(false);    btnHalt.setEnabled(true);    btnStop.setEnabled(true);       show.setText("Calculating...");    }    void halt() {    btnCal.setEnabled(true);    btnHalt.setEnabled(false);    btnStop.setEnabled(true);       show.setText("Halted...");    }    void stop() {    btnCal.setEnabled(true);    btnHalt.setEnabled(true);    btnStop.setEnabled(false);       show.setText("Stopped...");    }}

客户类:

public class MediatorClient extends JFrame implements ActionListener {    Mediator med = new Mediator();    MediatorClient() {       JPanel p = new JPanel();       p.add(new BtnCalculate(this,med));       p.add(new BtnHalt(this,med));       p.add(new BtnStop(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 MediatorClient();    }}

运行结果:

下载示例

 

  • Java代码 zigzagsoft_designpattern_mediator.zip