只有一个仲裁者

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. 小谢第36问:elemet - table表格修改后表格行高亮显示且定位到当前行当前页

    第一次做这个需求得时候很乱,总是在表格页和修改页徘徊,总觉得什么都会,但是就是做不出自己想要得效果 其实如果先把思路搞清楚,这个问题得知识点却是不多,以下是我对表格高亮显示得思路: 首先,我会从已知得 ...

  3. window下远程连接redis服务

    首先下redis包: 下载地址:https://github.com/MSOpenTech/redis/releases. 之后: 1.注释掉redis.windows-service.conf 中的 ...

  4. 耐心看,1个Dubbo漏洞,35道必问面试题,Dubbo没什么可神秘的

    Dubbo漏洞 无意中在网上看到了这样的一条新闻,说是我们360监测发现了Dubbo官方发布的危险漏洞通告,而且尴尬的是,世界上受影响最大的居然是中国,有图有真相 我感觉这也从侧面证明了一件事情,就是 ...

  5. python 复制以及更改列表操作

    题目:设置一个老用户列表和一个新用户列表,检查老用户列表中是否与新注册的用户名字有重复(不区分大小写),老用户列表不能被破坏 usernames = ['admin','Tom','john','ja ...

  6. 设计模式:interpreter模式

    理解:可以广义的理解为创造一种语言,实现该语言的解释器,然后用创造的语言编写程序 对比:如xml就是一种语言,解析xml的代码就是解释器 例子: //目标:定义4中几种命令,使用C++解析 //如下: ...

  7. 感知机算法(PLA)代码实现

    目录 1. 引言 2. 载入库和数据处理 3. 感知机的原始形式 4. 感知机的对偶形式 5. 多分类情况-one vs. rest 6. 多分类情况-one vs. one 7. sklearn实现 ...

  8. 动态DP,ddp

    动态DP?动态动态规划? 个人理解:动态DP,就是普通DP加修改操作,然后就变成了个毒瘤题. 直接就着例题写吧. 例题 P4719 [模板]"动态 DP"&动态树分治 求树 ...

  9. linux nginx 部署多套服务(以react包为例)

    前言 今天我特地写下笔记,希望可以完全掌握这个东西,也希望可以帮助到任何想对学习这个东西的同学. 本文用nginx部署服务为主要内容,基于CentOs 7.8系统. 文档版本:1.0.1 更新时间:2 ...

  10. linux命令笔记记录(自用)

    1.解除yum锁定: sudo rm -rf /var/run/yum.pid 2.删除文件夹: rm -rf /var/log/httpd/access 3.更新pip: python -m pip ...