【图解设计模式】Mediator模式

组员向仲裁者报告,仲裁者向组员下达指示。组员之间不再相互询问和相互指示。

示例

一个GUI应用程序,它展示了一个登录对话框,用户在其中输入正确的用户名和密码后可以登录。

  • 可以选择作为游客访问(Guest)或是作为用户登录(Login)
  • 作为用户登录时,需要输入正确的用户名(Username)和密码(Password)
  • 点击OK按钮可以登录,点击Cancel按钮可以取消登录

类图

时序图

Mediator接口

1234
public interface  {    public abstract void createColleagues();    public abstract void colleagueChanged();}

Colleague接口

1234
public interface Colleague {    public abstract void setMediator(Mediator mediator);    public abstract void setColleagueEnabled(boolean enabled);}

ColleagueButton类

12345678910111213141516171819
import java.awt.*;

public class ColleagueButton extends Button implements Colleague {    private Mediator mediator;

    public ColleagueButton(String caption) {        super(caption);    }

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

    public void setColleagueEnabled(boolean enabled) {        setEnabled(enabled);    }}

ColleagueTextField类

123456789101112131415161718192021222324252627
import java.awt.*;import java.awt.event.TextEvent;import java.awt.event.TextListener;

public class ColleagueTextField extends TextField implements TextListener, Colleague {    private Mediator mediator;

    public ColleagueTextField(String text, int columns) {        super(text, columns);    }

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

    public void setColleagueEnabled(boolean enabled) {        setEnabled(enabled);        setBackground(enabled ? Color.white : Color.lightGray);    }

    public void textValueChanged(TextEvent e) {        mediator.colleagueChanged();    }}

ColleagueCheckbox类

1234567891011121314151617181920212223242526
import java.awt.*;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;

public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {    private Mediator mediator;

    public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {        super(caption, group, state);    }

    @Override    public void setMediator(Mediator mediator) {        this.mediator = mediator;    }

    @Override    public void setColleagueEnabled(boolean enabled) {        setEnabled(enabled);    }

    @Override    public void itemStateChanged(ItemEvent e) {        mediator.colleagueChanged();    }}

LoginFrame类

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;

public class LoginFrame extends Frame implements ActionListener,  {    private ColleagueCheckbox checkGuest;    private ColleagueCheckbox checkLogin;    private ColleagueTextField textUser;    private ColleagueTextField textPass;    private ColleagueButton buttonOk;    private ColleagueButton buttonCancel;

    public LoginFrame(String title) {        super(title);        setBackground(Color.lightGray);        setLayout(new GridLayout(4, 2));

        createColleagues();

        add(checkGuest);        add(checkLogin);        add(new Label("Username:"));        add(textUser);        add(new Label("Password:"));        add(textPass);        add(buttonOk);        add(buttonCancel);

        colleagueChanged();

        pack();        show();    }

    @Override    public void createColleagues() {        CheckboxGroup g = new CheckboxGroup();        checkGuest = new ColleagueCheckbox("Guest", g, true);        checkLogin = new ColleagueCheckbox("Login", g, false);        textUser = new ColleagueTextField("", 10);        textPass = new ColleagueTextField("", 10);        textPass.setEchoChar('*');        buttonOk = new ColleagueButton("OK");        buttonCancel = new ColleagueButton("Cancel");

        checkGuest.setMediator(this);        checkLogin.setMediator(this);        textUser.setMediator(this);        textPass.setMediator(this);        buttonOk.setMediator(this);        buttonCancel.setMediator(this);

        checkGuest.addItemListener(checkGuest);        checkLogin.addItemListener(checkLogin);        textUser.addTextListener(textUser);        textPass.addTextListener(textPass);        buttonOk.addActionListener(this);        buttonCancel.addActionListener(this);    }

    @Override    public void colleagueChanged() {        if (checkGuest.getState()) {            textUser.setColleagueEnabled(false);            textPass.setColleagueEnabled(false);            buttonOk.setColleagueEnabled(true);        }        else {            textUser.setColleagueEnabled(true);            userpassChanged();        }    }

    private void userpassChanged() {        if (textUser.getText().length() > 0) {            textPass.setColleagueEnabled(true);

            if (textPass.getText().length() > 0)                buttonOk.setColleagueEnabled(true);            else                buttonOk.setColleagueEnabled(false);        }        else {            textPass.setColleagueEnabled(false);            buttonOk.setColleagueEnabled(false);        }    }

    @Override    public void actionPerformed(ActionEvent e) {        System.out.println(e.toString());        System.exit(0);    }}

Main类

123456
public class Main {

    public static void main(String[] args) {        new LoginFrame("Mediator Sample");    }}

运行结果

登场角色

Mediator(仲裁者、中介者)

Mediator角色负责定义与Colleague角色进行通信和做出决定的接口(API)。在示例程序中,由Mediator接口扮演此角色。

ConcreteMediator(具体的仲裁者、中介者)

ConcreteMediator角色负责实现Mediator角色的接口(API),负责实际做出决定。在示例程序中,由LoginFrame类扮演此角色。

Colleague(同事)

Colleague角色负责定义与Mediator角色进行通信的接口(API)。在示例程序中,由Colleague接口扮演此角色。

ConcreteColleague(具体的同事)

ConcreteColleague角色负责实现Colleague角色的接口(API)。在示例程序中,由ColleagueButton类、ColleagueTextField类和ColleagueCheckbox类扮演此角色。

类图

原文:大专栏  【图解设计模式】Mediator模式

原文地址:https://www.cnblogs.com/chinatrump/p/11584628.html

时间: 2024-08-02 11:32:55

【图解设计模式】Mediator模式的相关文章

图解设计模式-Strategy模式

Strategy(算法)模式可以整体的替换算法的实现部分. 重点说明: 使用委托这种弱关联关系可以很方便的整体替换算法. 角色: Strategy策略:该角色负责决定实现策略所需要的接口api. ConcreteStrategy具体策略:该角色负责实现Strategy角色接口api.即负责实现具体的策略. Context上下文:负责使用Strategy角色,Context角色保存了ConcreteStrategy角色的实例,并使用ConcreteStrategy角色去实现需求. 代码: publ

图解设计模式-Iterator模式

使用抽象类和接口,弱化类之间的耦合,使类可以更容易组件化 不使用具体类编程,要优先使用抽象类和接口编程 角色划分: Iterator迭代器接口,定义遍历元素的接口,hasNext判断是否有下一个.next获得下一个值 ConcreteIterator:迭代器具体的实现类,实现了hasNext.next两个方法,需要根据具体的被迭代对象进行自定. Aggregate集合接口,包含了获得Iterator迭代器的方法 ConcreteAggregate集合的具体实现类,实现了了获得Iterator迭代

Mediator模式

参考资料<大话设计模式> Mediator(中介者)模式: 使各个对象不需要显式的相互调用,从而使其耦合松散. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ds_mediator { class Program { static void Main(string[] args) { ConcreteMediator m = new Concrete

Mediator模式(C++实现)

主要参考<大话设计模式>和<设计模式:可复用面向对象软件的基础>两本书.本文介绍中介者模式的实现. 中介者模式:What it is:Define an object that encapsulates how a set of objects interact. Promotes loose coupling by keeping objects from referring to each other explicitly and it lets you vary their

java设计模式--Builder模式

一.Builder模式 二.使用例子 三.Spring中的Builder模式 Builder模式,构建者.构造者模式,在<图解设计模式>中归为 生成实例 一栏,该模式用于组装具有复杂结构的实例: 当需要逐步获取对象的初始值时,可以使用Builder模式: 一.Builder模式角色 Builder:建造者,Builder角色负责定义用来生成实例的接口API,Builder角色中准备了用于生成实例的具体方法: ConcreteBuilder:具体的建造者,负责实现Builder接口的的类,定义了

一天一个设计模式——迭代器模式

一.模式说明 迭代操作在程序开发中很常见:在数据集合中按顺序便利所有元素(例如:遍历一个数组中的所有元素),将遍历时使用的索引(如访问数组循环变量i)抽象化.通用化后形成的模式就是迭代器模式. 核心的迭代器一般包含两个方法:hasNext()和next()方法,前一个方法用于判断集合中是否还存在下一个需要迭代的元素,返回值类型是Bool类型:next()方法用于返回集合中一个元素,并且将迭代器移动到下一个元素. 该模式的UML图和示例代码UML图如下: 迭代模式的UML很简单,包含两个接口:Ag

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

设计模式 - 外观模式(facade pattern) 详解

外观模式(facade pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 外观模式(facade pattern): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用. 外观模式包含三个部分: 1. 子系统: 子类, 单个复杂子类 或 多个子类; 2. 外观(facade)类: 把子系统设计的更加容易使用; 3. 客户: 只需要调用外观类. 与适配器模式(adapter pattern)的