`

易学设计模式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
分享到:
评论

相关推荐

    易学设计模式源码光盘

    3. **行为型模式**:行为型模式处理对象间的行为分配,例如责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式...

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

    **中介者模式(Mediator)详解** 在软件工程中,设计模式是一种被广泛采用的解决常见问题的经验总结,其中中介者模式是结构型设计模式的一种。它的主要目标是降低对象之间的耦合度,使得对象之间的关系更加清晰,...

    调停者模式

    调停者模式涉及的角色包括抽象调停者(Mediator)、具体调停者(Concrete Mediator)、抽象同事类(Colleague)和具体同事对象(Concrete Colleague)。抽象调停者定义了同事对象与调停者之间的接口;具体调停者实现...

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

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

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

    **设计模式之中介者模式(Mediator Pattern)** 在软件工程中,设计模式是一种解决常见问题的经验总结,它提供了一种可复用的解决方案。中介者模式是行为设计模式之一,其主要目的是降低多个对象之间的复杂性,通过...

    设计模式 Mediator 中介者 c++

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

    mediator模式

    **中介者模式(Mediator Pattern)** 中介者模式是一种行为设计模式,它的主要目标是减少对象之间的耦合性,通过引入一个中介对象来协调多个对象之间的交互。在传统的多对象交互场景中,对象之间可能存在复杂的依赖...

    JAVA设计模式之调停者模式详解

    调停者模式是一种设计模式,属于对象的行为模式,其主要目的是降低对象之间的耦合度,使得对象之间的交互更加灵活且易于管理。在Java中,调停者模式通过引入一个中介对象,也就是调停者,来协调多个对象之间的交互,...

    Mediator模式

    Mediator模式是一种行为设计模式,它定义了一个用来封装一系列对象相互作用的接口,使得这些对象不必显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。这种模式在软件开发中常用于简化对象间的...

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

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

    C++ Mediator模式

    1. **Mediator(中介者)**: 这是模式的核心,定义了各个同事对象之间交互的接口。Mediator抽象类通常包含一组用于与同事对象交互的方法。 2. **Concrete Mediator(具体中介者)**: 实现Mediator接口,负责协调各个...

    JAVA设计模式chm文档

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

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

    ### C++设计模式之Mediator(中介者)详解 #### 一、引言 在软件开发过程中,随着系统的复杂度逐渐增加,各个组件之间的交互变得越来越频繁,这不仅增加了系统的耦合度,还使得系统维护变得困难重重。为了解决这一...

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

    标题和描述均提到了"C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式",这明确指向了一个特定的设计模式——中介者模式(Mediator Pattern),并且是在C#语言环境下的应用。下面将详细阐述这一设计...

    设计模式例子文档,简单易学

    3. 行为型模式:这类模式主要关注对象之间的交互和职责分配,包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘...

    JavaScript设计模式与开发实践.pdf

    由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、Decorator模式、Flyweight模式、Proxy模式、Chain ...

    JavaScript 设计模式 azw3

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

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

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

Global site tag (gtag.js) - Google Analytics