大话设计模式—中介者模式

中介者模式(Mediator Pattern)是用来减少多个对象和类之间的通信复杂性。

这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合。使代码易于维护。

中介者模式属于行为型模式。

引言:

虽然一个系统切割成很多对象通常能够添加其可复用性。可是对象间相互连接次数的添加又会减少其可复用性;大量的连接使得一个对象不可能在没有其它对象的支持下工作。系统表现为一个不可切割的总体,所以,对系统的行为进行不论什么较大的修改就十分困难了。

要解决这种问题。我们能够使用 迪米特原则 ,假设两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。假设须要相互调用,能够通过第三方来转发。

通过中介者对象,能够将系统的网状结构变成以中介者为中心的星型结构,每一个详细对象不再通过直接的联系与还有一个详细对象进行通信,而是通过中介者对象。中介者对象的设计使得系统的结构不会由于新对象的引入而造成大量的修改工作。

例如以下图联合国与各个国家的关系就是一个非常贴切的样例:

大话设计模式中程杰老师给出的定义是:

中介者模式。用一个中介对象来封装一系列的对象交互。中介者使各对象不须要显示的相互引用,从而使其耦合松散,并且能够独立的改变他们之间的交互。

代码实例:

抽象中介者

public abstract class Mediator{

    /**
     * 定义一个抽象的发送消息方法
     *  功能:得到同事对象和发送消息
     */
    public abstract void Send(String message,Colleague colleague);

}

抽象同事类

public abstract classColleague{

    protected Mediator mediator;

    //构造方法,得到中介者对象
    public Colleague(){
        this.mediator = mediator;
    }
}

中介者实现类

public class ConcreteMediator implements Mediator{

    private ConcreteMediatorA colleagueA;
    private ConcreteMediaorB colleagueB;

    //setter and getter

    //重写发送消息的方法,依据详细发送消息的对象去通知接收消息的对象
    public void send(String message,Colleague colleague){
        if(colleague == colleagueA){
            colleagueB.notify(message);
        }
        colleagueA.notify(message);
    }
}

同事对象实现类A

public class ConcreteColleagueA implements Colleague{

    public ConcreteColleagueA(Mediator mediator){
        this.mediator = mediator;
    }

    public void send(String message){
        //消息是通过中介者发送出去的
        mediator.send(message,this.concreteColleagueA);
    }

    public void notify(String message){
        Systen.out.println("A同事收到消息:" + message);
    }
}

同事对象实现类B

public class ConcreteColleagueB implements Colleague{

    public ConcreteColleagueB(Mediator mediator){
        this.mediator = mediator;
    }

    public void send(String message){
        //消息是通过中介者发送出去的
        mediator.send(message,this.concreteColleagueB);
    }

    public void notify(String message){
        Systen.out.println("B同事收到消息:" + message);
    }
}

測试类

public static void main(String[] args){

    ConcreteMediator mediator = new ConcreteMediator();

    //让两个详细同事类对象认识中介者对象
    ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
    ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);

    mediator.colleagueA = colleagueA;
    mediator.colleagueB = colleagueB;

    colleagueA.send("hi,nice to meet you!");
    colleagueB.send("nice to meet you too!");
}

执行结果:

B同事收到消息:hi,nice to meet you!
A同事收到消息:nice to meet you too!

长处:

1、减少了类的复杂度,将一对多转化成了一对一。

2、各个类之间的解耦。

3、符合迪米特原则。

缺点:中介者会庞大。变得复杂难以维护。

使用场景

1、系统中对象之间存在比較复杂的引用关系,导致它们之间的依赖关系结构混乱并且难以复用该对象。

2、想通过一个中间类来封装多个类中的行为。而又不想生成太多的子类。

注意事项:不应当在职责混乱的时候使用。

中介者模式的长处来自于集中控制,其缺点也是(中介者对象必须知道全部的同事对象),使用时要考虑清楚。

时间: 2024-10-13 23:32:04

大话设计模式—中介者模式的相关文章

大话设计模式--中介者模式

中介者模式:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 优点:Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator.由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统. 中介者模式一般应用于一组对象以定义良好但是复杂的

【大话设计模式】—— 模板方法模式

一.概念 上一篇文章刚刚讲了[大话设计模式]-- 原型模式,原型模式主要是通过Clone()方法,创建新的对象,免去了初始化的过程.模板方法模式也特别会"偷工减料",把不变的行为搬移到超类,去除子类中的重复代码,将代码的复用优势展现的淋漓尽致.它为我们提供了特定的结构和样式,我们只需关心填充数据内容就好,省心啊- 下面让我们来看一下它的准确定义: 模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta

【大话设计模式】——代理模式

对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持三种继承映射策略: 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态. 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

大话设计模式_原型模式(Java代码)

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 简单描述:即通过实现接口Cloneable重写方法clone(),使得创建新的拷贝对象不需要一个成员一个成员的重新复制,而且可以提高创建对象的效率 Java中要想实现拷贝使用clone()方法,类必须实现Cloneable接口,并且重写Object类中的clone()方法,调用父类的clone()方法即可实现浅复制 代码如下: WorkExperience类: 1 package com.longsheng.prototy

大话设计模式_模板方法模式(Java代码)

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 简单描述:多个类的行为是差不多的,只是某些局部不一样,则交由父类中抽象出这些子类中相同的部分,父类中定义出不同的部分的接口(方法),这些不同部分的方法则由子类去实现,通过多态,实现代码的重用 大话设计模式中的截图: 例子代码: AbstractClass类: 1 package com.longsheng.templatemethod; 2 3 public

大话设计模式_状态模式(Java代码)

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 简单描述:一个Context类(存有一个抽象状态State引用),调用状态类的方法.State的具体类方法中会判断Context类的状态(如时间),满足一个状态则执行相应动作,否则把Context的State引用指向下一个状态类,由下一个状态类决定相应行为 大话设计模式中的截图: 例子代码: Work类(Context): 1 package com.longsheng.state; 2 3 public cla

大话设计模式_建造者模式(Java代码)

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 简单描述:1个产品类(可有可无,关键是建造流程),1个抽象建造步骤类,多个具体建造子类(不同的类建造不同的产品),1个指挥者(用于规定建造流程),客户端指定需要建造的具体类型,由指挥者建造好之后,建造者子类返回对应产品给客户 大话设计模式中的截图: 例子代码: Product类: 1 package com.longsheng.builder; 2 3 public class Product { 4 5 pr