Java设计模式--中介者模式

中介者模式

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Mediator Pattern

Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from refering to each other explicitly, and it lets you vary their interaction independently.

类图

模式的结构与使用

中介者模式的结构中包括四种角色。
+ 中介者(Mediator):中介者使一个接口,该接口定义了用于同事(Colleague)对象之间进行通信的方法。
+ 具体中介者(Concrete Mediator):具体中介者是实现中介者接口的类。具体中介者需要包含所有具体同事(Concrete Colleague)的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信请求。
+ 同事(Colleague):一个接口,规定了具体同事需要实现的方法。
+ 具体同事(Concrete Colleague):实现同事接口的类。具体同事需要包含具体中介者的引用,一个具体同事需要和其他同事交互时,只需将自己的请求通知给它所包含的具体中介者即可。

简单的例子

同事接口类Colleague.java

package Mediator;

public interface Colleague {
    public void giveMess(String[] mess);
    public void receiverMess(String mess);
    public void setName(String name);
    public String getName();
}

本问题直接需要一个具体中介者ConcreteMediator.java

package Mediator;

public class ConcreteMediator {
    ColleagueA colleagueA;
    ColleagueB colleagueB;
    ColleagueC colleagueC;

    public void registerColleagueA(ColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }

    public void registerColleagueB(ColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }

    public void registerColleagueC(ColleagueC colleagueC) {
        this.colleagueC = colleagueC;
    }

    public void deliverMess(Colleague colleague, String[] mess) {
        if (colleague == colleagueA) {
            if (mess.length >= 2) {
                colleagueB.receiverMess(colleague.getName() + mess[0]);
                colleagueC.receiverMess(colleague.getName() + mess[1]);
            }
        }
        if (colleague == colleagueB) {
            if (mess.length >= 2) {
                colleagueA.receiverMess(colleague.getName() + mess[0]);
                colleagueC.receiverMess(colleague.getName() + mess[1]);
            }
        }
        if (colleague == colleagueC) {
            if (mess.length >= 2) {
                colleagueA.receiverMess(colleague.getName() + mess[0]);
                colleagueB.receiverMess(colleague.getName() + mess[1]);
            }
        }
    }
}

ConcreteColleague的实现类ColleagueA.java

package Mediator;

public class ColleagueA implements Colleague {

    ConcreteMediator cm;
    String name;

    public ColleagueA(ConcreteMediator cm) {
        this.cm = cm;
        cm.registerColleagueA(this);
    }

    @Override
    public void giveMess(String[] mess) {
        cm.deliverMess(this, mess);
    }

    @Override
    public void receiverMess(String mess) {
        System.out.println(name + "收到的信息");
        System.out.println("\t" + mess);
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

ConcreteColleague的实现类ColleagueB.java

package Mediator;

public class ColleagueB implements Colleague {

    ConcreteMediator cm;
    String name;

    public ColleagueB(ConcreteMediator cm) {
        this.cm = cm;
        cm.registerColleagueB(this);
    }

    @Override
    public void giveMess(String[] mess) {
        cm.deliverMess(this, mess);
    }

    @Override
    public void receiverMess(String mess) {
        System.out.println(name + "收到的信息");
        System.out.println("\t" + mess);
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

ConcreteColleague的实现类ColleagueC.java

package Mediator;

public class ColleagueC implements Colleague {

    ConcreteMediator cm;
    String name;

    public ColleagueC(ConcreteMediator cm) {
        this.cm = cm;
        cm.registerColleagueC(this);
    }

    @Override
    public void giveMess(String[] mess) {
        cm.deliverMess(this, mess);
    }

    @Override
    public void receiverMess(String mess) {
        System.out.println(name + "收到的信息");
        System.out.println("\t" + mess);
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

测试类Application.java

package Mediator;

public class Appication {

    public static void main(String[] args) {
        ConcreteMediator cm = new ConcreteMediator();
        ColleagueA colleagueA = new ColleagueA(cm);
        ColleagueB colleagueB = new ColleagueB(cm);
        ColleagueC colleagueC = new ColleagueC(cm);
        colleagueA.setName("A国");
        colleagueB.setName("B国");
        colleagueC.setName("C国");
        String[] messA = {"要求归还曾抢夺的100斤土豆", "要求归还曾抢夺的20头牛"};
        colleagueA.giveMess(messA);

        String[] messB = {"要求归还曾抢夺的10只公鸡", "要求归还曾抢夺的15匹马"};
        colleagueB.giveMess(messB);

        String[] messC = {"要求归还曾抢夺的300斤小麦", "要求归还曾抢夺的50头驴"};
        colleagueC.giveMess(messC);
    }
}

运行截图

中介者模式的优点

  • 可以避免许多的对象为了之间的通信而相互显示引用,否则,不仅系统难于维护,而且也使其他系统难以复用这些对象。
  • 可以通过中介者将原本分布于多个对象之间的交互行为集中在一起。当这些对象之间需要改变之间的通信行为时,只需使用一个具体中介者即可,不必修改各个具体同事的代码,即这些同事可被重用。
  • 具体中介者使得各个具体同事完全解耦,修改任何一个具体同事的代码不会影响到其他同事。
  • 具体中介者集中了同事之间是如何交互的细节,使系统比较清楚地知道整个系统中同事是如何交互的。
  • 当一些对象想相互通信,但又无法相互包含对方的引用,那么使用中介者模式就可以使这些对象互相通信。
    注:由于具体中介者集中了同事之间是如何交互的细节,可能使具体具体中介者变得非常复杂,增加了维护的难度。

适用中介者模式的情景

  • 许多对象以复杂的方式交,所导致的依赖关系使系统难以理解和维护。
  • 一个对象引用其他很多对象,导致难以复用该对象。

下载源码请到

MyGitHub

时间: 2024-10-26 23:20:10

Java设计模式--中介者模式的相关文章

java设计模式---prototype(原型)模式

设计 java设计模式---prototype(原型)模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.      Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,      工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求      原型对象拷贝它们自己来实施创建.      适用性:当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者  为了避免创建一个与产品类层次平行的工厂类层

浅谈Java设计模式关于原型模式(Prototype)思索建议

java教程:关于Java设计模式关于原型模式(Prototype) IT信息技术http://www.52ij.com/jishu/ 首先需要弄清楚什么叫原型模式,或者说为什么要有原型模式,运用它会给我们带来什么或能解决什么问题?原型模式(Prototype)同抽象工厂模式同属于创建型模式,它主要关注于大量相同或相似对象的创建问题,应用原型模式就是先需要一个原对象,然后通过对原对象进行复制(克隆),来产生一个与原对象相同或相似的新对象.注意这里所说的对象相同不是指复制出来的副本对象与原对象是同

详解Java设计模式之备忘录模式的使用_java

定义与结构     备忘录(Memento)模式又称标记(Token)模式.GOF给备忘录模式的定义为:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 在讲命令模式的时候,我们曾经提到利用中间的命令角色可以实现undo.redo的功能.从定义可以看出备忘录模式是专门来存放对象历史状态的,这对于很好的实现undo.redo功能有很大的帮助.所以在命令模式中undo.redo功能可以配合备忘录模式来实现. 其实单就实现保存一个对

15、Python与设计模式--中介者模式

一.仓储管理系统 有一个手机仓储管理系统,使用者有三方:销售.仓库管理员.采购.需求是:销售一旦达成订单,销售人员会通过系统的销售子系统部分通知仓储子系统,仓储子系统会将可出仓手机数量减少,同时通知采购管理子系统当前销售订单:仓储子系统的库存到达阈值以下,会通知销售子系统和采购子系统,并督促采购子系统采购:采购完成后,采购人员会把采购信息填入采购子系统,采购子系统会通知销售子系统采购完成,并通知仓库子系统增加库存.从需求描述来看,每个子系统都和其它子系统有所交流,在设计系统时,如果直接在一个子系

PHP设计模式——中介者模式

声明:本系列博客参考资料<大话设计模式>,作者程杰.        中介者模式用一个中介者对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互.         UML类图:                    角色:                  中介者接口(UnitedNations):在里面定义了各个同事之间相互交互所需要的方法.           具体的中介者实现对象(UnitedCommit):它需要了解并为维护

Java设计模式之Strategy模式_java

基于有了OO的基础后,开始认真学习设计模式!设计模式是java设计中必不可少的! Apple.java package strategy; /** * * @author Andy * */ public class Apple implements Discountable { //重量 private double weight; //单价 实际开发中 设计金钱等精确计算都是BigDecimal; private double price; //按购买量打折 // private Disco

Java设计模式之策略模式详解_java

本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Define a family of algorithms,encapsulate each one,and make them interchangeable.    (定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.) 策略模式的通用类图如下所示: 策略模式的三个角色: ● Context

Java设计模式之创建者模式简介_java

Java的创建者模式与工厂模式有点类似,不过关注点不同.工厂模式往往只关心你要的是什么,而不关心这个东西的具体细节是什么.相对而言创建模式则是关心这个东西的具体细节的创建.拿创建人物来说,我们关心的不仅是创建一个人物,还要关心他的性别,肤色和名字,则可以使用创建者模式. 程序实例如下所示: package builder; /** * * DOC 种族角色 * */ public class Race { private String name;// 名字 private String skin

Java设计模式之Visitor模式

Visitor定义 作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作的行为. 为何使用Visitor? Java的Collection(包括Vector和Hashtable)是我们最经常使用的技术,可是Collection好象是个黑色大染缸,本来有各种鲜明类型特征的对象一旦放入后,再取出时,这些类型就消失了.那么我们势必要用If来判断,如: I