只有一个仲裁者

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. 数据可视化之powerBI基础(十)快速度量值,帮你更快的进行数据分析

    https://zhuanlan.zhihu.com/p/64414831 刚开始学习PowerBI,最头疼的可能就是度量值了,毕竟用了Excel这么多年,只相信自己眼睛看到的,对于这个"虚 ...

  2. C#版本说明

    语言版本 发布时间 .NET Framework要求 Visual Studio版本 C# 1.0 2002.1 .NET Framework 1.0 Visual Studio .NET 2002 ...

  3. 你真的清楚DateTime in C#吗?

    DateTime,就是一个世界的大融合.   日期和时间,在我们开发中非常重要.DateTime在C#中,专门用来表达和处理日期和时间. 本文算是多年使用DateTime的一个总结,包括DateTim ...

  4. Python 简明教程 --- 24,Python 文件读写

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 过去的代码都是未经测试的代码. 目录 无论是哪种编程语言,IO 操作都是非常重要的部分.I 即Inp ...

  5. 一个通用的两级Makefile例子

    目的 进行如项目的顶层目录后,运行make,即可直接编译项目中所有的源文件,并生成最终的可执行文件 实现头文件自动依赖 添加源文件不用修改Makefile,且可以自动编译新文件 顶层目录下添加文件夹, ...

  6. python 模型的释义

    CharField #字符串字段, 用于较短的字符串. #CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数. Integer ...

  7. 图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录)

    图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录): https://download.csdn.net/download/qq_39932172/11 ...

  8. 如何用redis做缓存

    redis缓存 在互联网应用中经常需要用redis来缓存热点数据. redis数据在内存,可以保证数据读取的高效,接近每秒数十万次的吞吐量 减少下层持久层数据库读取压力,像mongodb,每秒近千次读 ...

  9. iframe和DataForm

    一.iframe使用 iframe在一个页面中,相当于整个window窗口的子窗口,可通过页面的元素结构查看. <div> <p>学习iframe</p> < ...

  10. github提交报错

    github正确提交步骤 https://www.cnblogs.com/alex-415/p/6912294.html 可能的错误 提交前没有先pull,主要的原因是在创建repository的时候 ...