[设计模式]中介者模式

1. 定义

  用一个中介者对象来封装了一个系列对象的交互,中介者使得各个对象可以不需要显式的引用,而且可以独立改变对象之间的交互。

  中介者模式思路很简单,中介者模式中通过引入一个中介者对象,让其他对象与中介者对象进行交互,而中介者对象知道如何和所有对象交互,这样对象之间的交互关系就没有了,从而实现对象之间解耦。

  每个同事对象发生了变化,不需要知道这样会引起其他对象什么变化,只需要通知中介者,由中介者去与其他对象交互。这样的松耦合带来的好处是,同事对象之间的交互关系减少,而且有利于功能的修改和扩展。

2. 类图

  

  Mediator:中介者接口,定义了同事对象之间交互的方法,可以是比较通用的方法,比如change,也可以是小范围的交互方法。

  ConcreteMediator:中介者实体,实现接口中定义的方法,持有同事对象的引用,负责协调同事对象之间的交互。

  Colleague:同事类,通常抽象为抽象类,主要功能是约束同事对象的类型,实现一些公用的方法。

  ColleagueA、ColleagueB:同事实体,实现各自的业务,需要与其他同事对象交互时,与中介者通信,让中介者处理交互。

3. 实例

  

package com.jerry.designpattern;
/**
 * 中介者
 * @author Jerry
 * @date 2015年1月20日 上午11:05:00
 */
public interface Mediator {
    /**
     *
     * @param mediator
     */
    void changed(Colleague colleague);
}

package com.jerry.designpattern;
/**
 *
 * @author Jerry
 * @date 2015年1月20日 上午11:26:05
 */
public class MainBoard implements Mediator{

    private CDDriver cdDriver;
    private CPU cpu;
    private VideoCard videoCard;
    private SoundCard soundCard;

    public void setCdDriver(CDDriver cdDriver) {
        this.cdDriver = cdDriver;
    }

    public void setCpu(CPU cpu) {
        this.cpu = cpu;
    }

    public void setVideoCard(VideoCard videoCard) {
        this.videoCard = videoCard;
    }

    public void setSoundCard(SoundCard soundCard) {
        this.soundCard = soundCard;
    }

    @Override
    public void changed(Colleague colleague) {
        // TODO Auto-generated method stub
        if (colleague instanceof CDDriver) {
            String data = cdDriver.getData();
            cpu.executeData(data);
        } else if (colleague instanceof CPU) {
            videoCard.showVideo(cpu.getVideoData());
            soundCard.soundData(cpu.getSoundData());
        }
    }

}

package com.jerry.designpattern;
/**
 *
 * @author Jerry
 * @date 2015年1月20日 上午11:04:43
 */
public abstract class Colleague {

    private Mediator mediator;

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

    public Mediator getMediator() {
        return mediator;
    }

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

}

package com.jerry.designpattern;
/**
 *
 * @author Jerry
 * @date 2015年1月20日 上午11:14:26
 */
public class CPU extends Colleague{
    public CPU(Mediator mediator) {
        super(mediator);
    }

    private String videoData;
    private String soundData;

    public String getVideoData() {
        return videoData;
    }

    public String getSoundData() {
        return soundData;
    }

    public void executeData(String data) {
        String[] ss = data.split(",");
        this.videoData = ss[0];
        this.soundData = ss[1];
        super.getMediator().changed(this);
    }
}

package com.jerry.designpattern;
/**
 *
 * @author Jerry
 * @date 2015年1月20日 上午11:06:49
 */
public class CDDriver extends Colleague{
    private String data;

    public CDDriver(Mediator mediator) {
        super(mediator);
    }

    public void readCD() {
        this.data = "设计模式,值得好好研究";
        super.getMediator().changed(this);
    }

    public String getData() {
        return this.data;
    }
}

package com.jerry.designpattern;
/**
 *
 * @author Jerry
 * @date 2015年1月20日 上午11:23:19
 */
public class SoundCard extends Colleague{

    public SoundCard(Mediator mediator) {
        super(mediator);
    }

    public void soundData(String data) {
        System.out.println("画外音:" + data);
    }
}

package com.jerry.designpattern;
/**
 *
 * @author Jerry
 * @date 2015年1月20日 上午11:20:31
 */
public class VideoCard extends Colleague{

    public VideoCard(Mediator mediator) {
        super(mediator);
    }

    public void showVideo(String data) {
        System.out.println("正在观看:" + data);
    }
}

package com.jerry.designpattern;
/**
 *
 * @author Jerry
 * @date 2015年1月20日 上午11:31:44
 */
public class Client {
    public static void main(String[] args) {
        MainBoard mainBoard = new MainBoard();

        CDDriver cdDriver = new CDDriver(mainBoard);
        CPU cpu = new CPU(mainBoard);
        VideoCard videoCard = new VideoCard(mainBoard);
        SoundCard soundCard = new SoundCard(mainBoard);

        mainBoard.setCdDriver(cdDriver);
        mainBoard.setCpu(cpu);
        mainBoard.setVideoCard(videoCard);
        mainBoard.setSoundCard(soundCard);
        cdDriver.readCD();
    }
}

4. 认识中介者模式

  中介者模式功能非常简单,就是封装对象之间的交互,如果一个对象的操作,会引起其他相关对象的改变,或者某个操作需要引起对象的后续和连续操作,而这个对象不想自己处理这些关系,那就可以交给中介者来处理,把所有麻烦都交给中介者,只在需要的时候通知中介者,其他的让中介者来处理就可以了。

5. 中介者优缺点

  优点:松散耦合,集合控制交互,多对多变成一对多

  缺点:过度集中化,如果同事之间的交互非常多,而且比较复杂,全部集中在中介者中,会使中介者变得十分复杂,难以管理和维护。

时间: 2024-10-09 22:48:49

[设计模式]中介者模式的相关文章

【C#设计模式-中介者模式】

一.概述:中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系.中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为. 二.例子:QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用. 三.结构: 者模式设计两个具体对象,一个是用户类,另一个是中介者类,根据针对接口编程原则,则需要把这两类角色进行抽象,所以中介者模式中就有了4类角色,它们分别是:抽象中介者角色,具体中介者角色.抽象同事类和具体同事类.中介者类是起到协调各

7. 星际争霸之php设计模式--中介者模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248183.html============================================

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

中介者模式(Mediator Pattern)是用来减少多个对象和类之间的通信复杂性. 这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合.使代码易于维护. 中介者模式属于行为型模式. 引言: 虽然一个系统切割成很多对象通常能够添加其可复用性.可是对象间相互连接次数的添加又会减少其可复用性:大量的连接使得一个对象不可能在没有其它对象的支持下工作.系统表现为一个不可切割的总体,所以,对系统的行为进行不论什么较大的修改就十分困难了. 要解决这种问题.我们能够使用 迪米特原则 ,假设

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

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

[设计模式] 中介者模式 Mediator Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 我们都知道,面向对象设计鼓励将行为分布到各个对象中.但是,这种分布可能会导致对象间有许多连接.在最坏的情况下,每一个对象都知道其他所有对象,就造成了复杂的关联关系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性.大量的相互连接使得一个对象似乎不太

深入浅出设计模式——中介者模式(Mediator Pattern)

模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题:? 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理.? 对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱.? 系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统

PHP设计模式 - 中介者模式

中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改. 一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式.PHP中不是特别常用的设计模式. <?php abstract class Mediator { // 中介者角色 abstract public function send($message,$colleague); } abstract class Colleague { // 抽象对象 private

设计模式----中介者模式及简单总结(2018/10/30)

中介者模式 这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 代码实现:   知识点回顾 设计模式的核心是: 高内聚 低耦合 代码编写多 但是方便维护 1. 单例模式: 懒汉和饿汉(直接就new 线程相对安全) 但是在unity不涉及多线程, 所以都行 一般人们写的懒汉多一点 1). 普通class 2). 里面一个私有的 静态属性 对象 3). 私有构造函数 4). 共有 静态 对象返回值类型的 方法(GetInstance/Ge

23种设计模式--中介者模式-Mediator Pattern

一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再把中介和用户类分成2个类,这样就成了抽象中介者角色,具体中介者角色.抽象同事类和具体同事类.来几个例子比如说各种游戏平台,还有我们最熟悉的QQ平台,等等这些都是中介者模式的具体应用,中介者模式常用于处理通信之间复杂有关联的业务,这样就会存在一个缺点比如说因为中介者处理了好多用户之间的关系,一但发生错