`

易学设计模式14 调停者模式(Mediator)

阅读更多
调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。

为什么需要调停者
如下图所示,这个示意图中有大量的对象,这些对象既会影响别的对象,又会被别的对象所影响,因此常常叫做同事(Colleague)对象。这些同事对象通过彼此的相互作用形成系统的行为。从图中可以看出,几乎每一个对象都需要与其他的对象发生相互作用,而这种相互作用表现为一个对象与另一个对象的直接耦合。这就是过度耦合的系统。


通过引入调停者对象(Mediator),可以将系统的网状结构变成以中介者为中心的星形结构,如下图所示。在这个星形结构中,同事对象不再通过直接的联系与另一个对象发生相互作用;相反的,它通过调停者对象与另一个对象发生相互作用。调停者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为新对象的引入造成大量的修改工作。


一个好的面向对象的设计可以使对象之间增加协作性(Collaboration),减少耦合度(Couping)。一个深思熟虑的设计会把一个系统分解为一群相互协作的同事对象,然后给每一个同事对象以独特的责任,恰当的配置它们之间的协作关系,使它们可以在一起工作。







抽象调停者(Mediator)角色
具体调停者(ConcreteMediator)角色
抽象同事类(Colleague)角色
具体同事类(ConcreteColleague)角色

public abstract class Colleague {

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

public class CDDriver extends Colleague {
	
	// 光驱读取出来的数据  
    private String data = "";

	public CDDriver(Mediator mediator) {
		super(mediator);
	}
	/** 
     * 获取光盘读取出来的数据 
     */ 
	public String getData() {  
        return data;  
    }  
	
	/** 
     * 读取光盘 
     */ 
	public void readCD() {
		// 逗号前是视频显示的数据,逗号后是声音  
        this.data = "One Piece,海贼王我当定了"; 
     // 通知主板,自己的状态发生了改变  
        this.getMediator().changed(this);
	}

}

package com.jiaozg.mediator;

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 [] array = data.split(",");
    	this.videoData = array[0];
    	this.soundData = array[1];
    	this.getMediator().changed(this);
    }
	
}

package com.jiaozg.mediator;

public class VideoCard extends Colleague {

	public VideoCard(Mediator mediator) {
		super(mediator);
	}
	/** 
     * 显示视频数据 
     */  
	public void showData(String data) {
		System.out.println("您正在观看的是:" + data);  
	}
}

package com.jiaozg.mediator;

public class SoundCard extends Colleague {

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

}

package com.jiaozg.mediator;

public interface Mediator {
	
	public void changed(Colleague c);

}

package com.jiaozg.mediator;

public class MainBoard implements Mediator {

	private CDDriver cdDriver = null;
	private CPU cpu = null;
	private VideoCard videoCard = null;
	private SoundCard soundCard = null;
	
	public void changed(Colleague c) {
		
		if(c instanceof CDDriver) {
			this.openCDDriverReadData(cdDriver);
		} else if(c instanceof CPU) {
			this.openCPU(cpu);
		}

	}
	
	private void openCDDriverReadData(CDDriver cd) {
		// 把这些数据传递给CPU进行处理 
		cpu.executeData(cd.getData());
	}
	
	public void openCPU(CPU cpu) {
		// 把这些数据传递给显卡和声卡展示出来
		videoCard.showData(cpu.getVideoData());
		soundCard.soundData(cpu.getSoundData());	
	}

	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;
	}

}

package com.jiaozg.mediator;

public class Client {

	public static void main(String[] args) {
		// 创建调停者——主板
		MainBoard mediator = new MainBoard();
		// 创建同事类
		CDDriver cd = new CDDriver(mediator);
		CPU cpu = new CPU(mediator);
		VideoCard vc = new VideoCard(mediator);
		SoundCard sc = new SoundCard(mediator);
		// 让调停者知道所有同事  
		mediator.setCdDriver(cd);
		mediator.setCpu(cpu);
		mediator.setVideoCard(vc);
		mediator.setSoundCard(sc);
		// 开始看电影,把光盘放入光驱,光驱开始读盘
		cd.readCD();
	}

}


输出结果:

您正在观看的是:One Piece
画外音:海贼王我当定了

参考:http://blog.csdn.net/m13666368773/article/details/7712213
  • 大小: 28.7 KB
  • 大小: 20.8 KB
  • 大小: 31.1 KB
  • 大小: 24.8 KB
  • 大小: 47.4 KB
分享到:
评论

相关推荐

    设计模式之中介者模式(Mediator)

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

    [源代码] 《易学 设计模式》 随书源代码

    第23章 左右逢源:调停者模式 (Mediator) 第24章 白纸黑字:备忘录模式 (Memento) 第25章 周而复始:迭代器模式 (Iterator) 第26章 望文生义:解释器模式 (Interpreter) 第27章 无招胜有招:如何在设计中应用设计...

    设计模式 Mediator 中介者 c++

    中介者模式的完整代码。 程序默认使用vs开发。其他开发工具可能需要做少许调整。

    运用Mediator设计模式的登录对话框

    这是一个运用了中介者设计模式的登录对话框练习题。 该案例改编自结城浩《设计模式-java语言中的应用》一书。 This is a program about a login dialog, wich try to illustrate the design pattern of Mediator. ...

    C++ Mediator模式

    23种设计模式之十八(行为模式)Mediator模式

    JAVA设计模式chm文档

    创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: ...设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    设计模式之中介者模式(Mediator Pattern)

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

    mediator模式

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

    C++设计模式课件17_Mediator_中介者.pdf

    C++设计模式课件17_Mediator_中介者.pdf

    JavaScript 设计模式 azw3

    然后,集中介绍了很多流行的设计模式在JavaScript中的应用,包括Module(模块)模式、Observer(观察者)模式、Facade(外观)模式和Mediator(中介者)模式;最后,还探讨了模块化的JavaScript模式、jQuery及其插件...

    (行为型模式) Mediator 中介者模式

    C#面向对象设计模式 (行为型模式) Mediator 中介者模式 视频讲座下载

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式

    研磨设计模式(完整带书签).part2.pdf

    第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template ...

    设计模式文档 chm

    设计模式参考文档 创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) ...设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式 C#面向对象设计模式纵横谈(18):(行为型模式) Iterator 迭代器模式 C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 C#...

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式 (Level 300)

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式 (Level 300)

    论文研究-一种基于Mediator设计模式的车载多媒体系统设计 .pdf

    一种基于Mediator设计模式的车载多媒体系统设计,宋飞,郭文明,如今,车载多媒体系统已经在汽车产业发展中扮演了越来越重要的角色,而车载系统的设计方式也必将受到越来越多的重视。本文从系统

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第10章 调停者(mediator)模式 85 第11章 代理(proxy)模式 97 第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 ...

    设计模式精解-GoF 23种设计模式解析

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码 目 录 引 言 0.1 设计模式解析(总序) 0.2 设计模式解析后记 0.3 与作者联系 1 创建型模式 1.1 Factory模式 1.2 AbstactFactory模式 1.3 Singleton...

    HeadFirst设计模式(中文版)

    至于第14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、Chain of Responsibility、Flyweight、Interpreter、Mediator、Memento、Prototype,Visitor。第1章还介绍了四个○○基本概念(抽象、封装、继承、...

Global site tag (gtag.js) - Google Analytics