只有一个仲裁者

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. java 基本语法(七) 流程控制(四) 补充:Scanner类的使用

    /* 如何从键盘获取不同类型的变量:需要使用Scanner类 具体实现步骤: 1.导包:import java.util.Scanner; 2.Scanner的实例化:Scanner scan = n ...

  2. 前端05 /js基础

    前端05 /js基础 昨日内容回顾 css选择器的优先级 行内(1000) > id(100) > 类(10) > 标签(1) > 继承(0) 颜色 rgb(255,255,2 ...

  3. uPDF-功能强大的PDF文件处理小工具

    前几天因为工作原因,需要将一个PDF压缩一下. 网上找了半天,要么收费,要么就是转换的质量不太好.论坛也找到一些破解的软件,但是总有点不太合适,有些功能还挺复杂.也有些在线转换的,又考虑到自己较为隐私 ...

  4. [Cordova]Cordova6.x自定义插件之Andorid

    1.继承了CordovaPlugin的Java Class 需要重写execute方法,如下: 2.在res/xml/config.xml中关联上述java class 3.在assets/www/p ...

  5. 操作句柄Handle(7)

    可以将Handle理解成访问对象的一个“句柄”.垃圾回收时对象可能被移动(对象地址发生改变),通过Handle访问对象可以对使用者屏蔽垃圾回收细节. Handle涉及到的相关类的继承关系如下图所示. ...

  6. 使用Python进行自动化测试

    目前大家对Python都有一个共识,就是他对测试非常有用,自动化测试里Python用途也很广,但是Python到底怎么进行自动化测试呢?今天就简单的向大家介绍一下怎么使用Python进行自动化测试,本 ...

  7. 又被逼着优化代码,这次我干掉了出入参 Log日志

    本文收录在个人博客:www.chengxy-nds.top,技术资源共享. 最近技术部突然刮起一阵 review 代码的小风,挨个项目组过代码,按理说这应该是件挺好的事,让别人指出自己代码中的不足,查 ...

  8. JAVA 实现将多目录多层级文件打成ZIP包后保留层级目录下载 ZIP压缩 下载

    将文件夹保留目录打包为 ZIP 压缩包并下载 上周做了一个需求,要求将数据库保存的 html 界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台:在数据库中保存的是html标签 ...

  9. PowerJob 技术综述,能领悟多少就看你下多少功夫了~

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列.从本章开始,就正式进入 PowerJob 框架的技术 ...

  10. 【转载】基于dom的一些前端漏洞

    最直接的xss --dom xss function trackSearch(query) { document.write('<img src="/resources/images/ ...