Mediator 中介模式

模式定义

 

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

使用方法

 

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

使用范围

 

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

举例说明

 

创捷一个应用程序,该程序具有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();
    }
}

运行结果:

下载示例

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值