只有一个仲裁者

Mediator 模式

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

要调整多个对象之间的关系时,就需要用到 Mediator 模式。将逻辑处理交给仲裁者执行。

示例程序

名字 说明 角色
Mediator 定义“仲裁者”的接口的接口 Mediator
Colleague 定义“组员”的接口的接口 Colleague
ColleagueButton 表示按钮的类。它实现了 Colleague 接口 ConcreteColleague
ColleagueTextField 表示文本输入框的类。它实现了 Colleague 接口 ConcreteColleague
ColleagueCheckbox 表示单选框的类。它实现了 Colleague 接口 ConcreteColleague
LoginFrame 表示登录对话框的类。它实现了 Mediator 接口 ConcreteMediator
Main 测试程序行为的类  

Mediator.java

 package mediator;
 
 public interface Mediator {
     public abstract void createColleague();
     public abstract void colleagueChanged();
 }

Colleague.java

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

ColleagueButton.java

 package mediator;
 
 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.java

 package mediator;
 
 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.java

 package mediator;
 
 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);
    }
     public void setMediator(Mediator mediator) {
         this.mediator = mediator;
    }
     public void setColleagueEnabled(boolean enabled) {
         setEnabled(enabled); 
        setBackground(enabled ? Color.WHITE : Color.lightGray); 
   } 
    public void itemStateChanged(ItemEvent e) { 
        mediator.colleagueChanged(); 
   } 
}

LoginFrame.java

 package mediator;
 
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 
 public class LoginFrame extends Frame implements ActionListener, Mediator {
     private ColleagueCheckbox checkGuest;
     private ColleagueCheckbox checkLogin;
     private ColleagueTextField textUser;
     private ColleagueTextField textPass;
     private ColleagueButton buttonOk;
     private ColleagueButton buttonCancel;
 
     // 构造函数
     // 生成并配置各个Colleague后,显示对话框
     public LoginFrame(String title) { 
        super(title); 
        setBackground(Color.lightGray); 
        setLayout(new GridLayout(4, 2)); 
        createColleague(); 
        add(checkGuest); 
        add(checkLogin); 
        add(new Label("Username:")); 
        add(textUser); 
        add(new Label("Password:")); 
        add(textPass); 
        add(buttonOk); 
        add(buttonCancel); 
        colleagueChanged(); 
        pack(); 
        show(); 
   }       public void createColleague() { 
        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); 
   }       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); 
       } 
   }       public void actionPerformed(ActionEvent e) { 
        System.out.println(e.toString()); 
        System.exit(0); 
   } 
}

Main.java

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

Mediator 模式中的角色

  1. Mediator(仲裁者、中介者)

    Mediator 角色负责定义与 Colleague 角色进行通信和做出决定的接口。

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

    ConcreteMediator 角色负责实现 Mediator 角色的接口,负责实际做出决定。

  3. Colleague(同事)

    Colleague 角色负责定义与 Mediator 角色进行通信的接口。

  4. ConcreteColleague(具体的同事)

    ConcreteColleague 角色负责实现 Colleague 角色的接口。

拓展思路

一、Bug容易定位,因为没有别的控制控件做逻辑控制处理。

二、ConcreteColleague 角色可以复用,ConcreteMediator 角色难以复用。

公众号发哥讲

这是一个稍偏基础和偏技术的公众号,甚至其中包括一些可能阅读量很低的包含代码的技术文,不知道你是不是喜欢,期待你的关注。

如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈~

● 扫码关注我们

据说看到好文章不推荐的人,服务器容易宕机!

本文版权归发哥讲博客园共有,原创文章,未经允许不得转载,否则保留追究法律责任的权利。

 

16、Mediator 仲裁者模式的更多相关文章

  1. 设计模式16:Mediator 中介者模式(行为型模式)

    Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...

  2. C++设计模式-Mediator中介者模式

    Mediator中介者模式作用:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. UML如下: Colleage抽象同事类 ...

  3. 设计模式 ( 十六 ): Mediator中介者模式 -- 行为型

    1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象 ...

  4. 设计模式(17)--Mediator(中介者模式)行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以 ...

  5. Ubuntu 16.04 grub rescue 模式下修复 grub

      前几天整理了下电脑的分区,合并并删除一些分区,结果导致 grub 被破坏了,Ubuntu进不去了,启动后直接进入了 rescure 模式.后来又折腾了下,终于修复好了,现总结一下. 先说一下我的系 ...

  6. win7 +v Ubuntu 16.04 grub rescue 模式下修复 grub

    前几天整理了下电脑的分区,合并并删除一些分区,结果导致 grub 被破坏了,Ubuntu进不去了,启动后直接进入了 rescure 模式.后来又折腾了下,终于修复好了,现总结一下. 先说一下我的系统环 ...

  7. 【设计模式 - 16】之迭代器模式(Iterator)

    1      模式简介 迭代器模式是JAVA中非常常用的模式,List.Map.Set等常见集合中都封装了迭代器Iterator. 迭代器模式的介绍: 迭代器模式用于顺序访问集合对象中的元素,而不需要 ...

  8. Mediator - 中介者模式

    定义 用一个中介对象来封装一系列的对象的交互.中介者使各对象不须要显示地相互使用,从而使其耦合松散,并且能够独立的改变他们之间的交互. 案例 比方有一个图像界面,在界面上有一个输入框LineEdit, ...

  9. Akka(16): 持久化模式:PersistentFSM-可以自动修复的状态机器

    前面我们讨论过FSM,一种专门为维护内部状态而设计的Actor,它的特点是一套特殊的DSL能很方便地进行状态转换.FSM的状态转换模式特别适合对应现实中的业务流程,因为它那套DSL可以更形象的描述业务 ...

随机推荐

  1. web 部署专题(零):web相关概念以及原理

    1.什么是 nginx Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数. 2.正向代理 (1)需 ...

  2. unity-TextAsset

    定义: 当把Text files导到unity,将会变成TextAsset. 支持的格式: .txt .html .htm .xml .bytes .json .csv .yaml .fnt 注意 不 ...

  3. 一文读懂对抗生成学习(Generative Adversarial Nets)[GAN]

    一文读懂对抗生成学习(Generative Adversarial Nets)[GAN] 0x00 推荐论文 https://arxiv.org/pdf/1406.2661.pdf 0x01什么是ga ...

  4. 【翻译】.NET 5中的性能改进

    [翻译].NET 5中的性能改进 在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进. 从.NET Core 2.0到.NET Core 2.1到.NET Core ...

  5. 一个简单的Maven小案例

    Maven是一个很好的软件项目管理工具,有了Maven我们不用再费劲的去官网上下载Jar包. Maven的官网地址:http://maven.apache.org/download.cgi 要建立一个 ...

  6. SpringCloud或SpringBoot+Mybatis-Plus利用AOP+mybatis插件实现数据操作记录及更新对比

    引文 本文主要介绍如何使用Spring AOP + mybatis插件实现拦截数据库操作并根据不同需求进行数据对比分析,主要适用于系统中需要对数据操作进行记录.在更新数据时准确记录更新字段 核心:AO ...

  7. Python Ethical Hacking - BACKDOORS(1)

    REVERSE_BACKDOOR Access file system. Execute system commands. Download files. Upload files. Persiste ...

  8. 消除win10桌面图标的右下方小箭头

    很容易的小东西,在这里简单提一下 新建一个记事本,写下以下代码,改为.bat后缀,双击运行,然后箭头消失 reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Micro ...

  9. C++语法小记---函数对象

    函数对象 用于替代函数指针 优势:函数对象内部可以保存状态,而不必使用全局变量或静态局部变量 关键:重载"()"操作符 #include<iostream> #incl ...

  10. 抽象工厂模式(c++实现)

    抽象工厂模式 目录 抽象工厂模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 感悟 模式定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而 ...