`

从实例解析中介者模式--交通信号灯

阅读更多
从实例解析中介者模式--交通信号灯

          在学习JAVA过程中,我做过的第一个小有成就的项目是一个仿XP的画图板。因为是初次接触使用编程语言做一些自认为还比较实际的东西,所以我整个画图板,从开始写Swing界面,到最后的BMP保存完成,我用了近乎两个月的时间。记得初步完成(XP画板上的画笔工具实现,重绘完成)时,我的画板只有2个类DrawUI(画板的界面)和DrawListener(监听器),共682行代码,窗体类234行,画图监听器448行;现在,这个画板(新增了BMP功能)有2个包,共30个类,代码也就一千多行。整个画图板的功能并没有什么太大区别,但是代码的结构却发生了天翻地覆发变化。第一个版本出错时,只有我愿意话费两三个小时,甚至几天时间去查找错误,因为它是我写的;最后一个版本,已经给部分正在学画图板的同学拿去借鉴了,想必他们是看得懂的。这就是代码结构带来的区别。一段清晰明朗的代码,就如一头梳理顺畅的直发一样,不会给人“剪不断,理还乱”的烦恼。
       因此,在着手写代码前,要学会设计代码之间的架构关系,搭建一个结实简明的框架结构。这种源自于建筑学的理论,被运用到软件领域,即设计模式(Design Pattern),它是面向对象语言中利用类和方法实现某个编程目标的方法。
       人们根据面向对象的4个原则:
1、面向抽象原则
2、开闭原则:让设计对扩展开放,对修改关闭
3、多用组合少用继承
4、高内聚——低耦合原则
将软件的23种设计模式分为5类。



       在信息还不发达的中国,人与人之间的交流很局限,因此产生了很多的角色来调节这种信息不通的场面,如媒婆、信使等,都在人们的生活中起着重要作用。而在设计模式中,中介者模式就是这类实例的灵活运用。
中介者模式(Mediator Parttern):用一个对象来封装一系列的对象交互。中介者使各对象不需要显示相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
        中介者模式的结构中包含的角色:
1、中介者(Mediator):中介者是一个interface ,该接口定义了用于同事对象之间进行通信的方法。
2、具体终结者(ConcreteMediator):实现中介者接口的类。需包含所有具体同事(ConcreteColleague)的引用:并通过实现中介者接口的方法来满足具体同事之间的通信请求
3、同事(Colleague):一个接口,规定了具体同时需要实现的方法
4、具体同事(ConcreteCplleague):实现同事接口,一个具体同事需要和其他具体同事交互时,只需将自己的请求通知给它所包含的具体中介者
        假设有三国在交战:分别是魏、蜀、吴,现有如下交易,但是三个国家的关系正处于水深火热之中,因此,就需要一个中间人进行谈判信息的交换,及中介者。



用中介者模式解决该问题即可设计以下几个类:
同事:Colleague
具体同事:ConcreteColleagueA(魏),ConcreteColleagueB(蜀), ConcreteColleagueC(吴)
中介者:Mediator(信使)
Colleague类:

/**
 * 同事类
 * 定义了具体同事,交战双方需要实现的方法
 * @author CarmenCai
 *
 */
public interface Colleague {
	//需要中介者转达的信息
	public void giveMes(String[] mes);
	//接收到的信息
	public void receiverMes(String mes);
	//具体同事的名字
	public void setName(String name);
	//得到具体同事的名字
	public String getName();

}

其中一个具体的ConcreteColleague类:
/**
 * 具体同事A
 * @author CarmenCai
 *
 */
public class ColleagueA implements Colleague{
	//姓名
	String name;
	//具体中介者
	ConcreteMediator mediator;
	/**
	 * 创建带有指定具体中介者的同事A
	 * @param mediator
	 */
	public ColleagueA(ConcreteMediator mediator){
		this.mediator=mediator;
		//注册该用户
		mediator.registerColleague(this);
	}
	/**
	 * 得到姓名
	 */
	public String getName() {
		return name;
	}
	/**
	 * 发送的信息
	 */
	public void giveMes(String[] mes) {
		mediator.deliverMes(this, mes);
	}
	/**
	 * 接收的信息
	 */
	public void receiverMes(String mes) {
		System.out.println(name+"收到的消息是:\n\t"+mes);
	}
	public void setName(String name) {
		this.name=name;
	}
}

Mediator(中介者):
/**
 * 中介者类
 * @author CarmenCai
 *
 */
public interface Mediator {
	//注册具体同事用户
	public void registerColleague(Colleague colleague);
	//传达消息
	public void deliverMes(Colleague colleague,String[] mes);

}

用于连接三个国家,并送出谈判信息ConcreteMediator(具体中介者):
/**
 * 具体中介者类
 * 实现中介者接口
 * @author CarmenCai
 *
 */
public class ConcreteMediator implements Mediator{
	//声明具体同事
	ColleagueA colleagueA;
	ColleagueB colleagueB;
	ColleagueC colleagueC;
	/**
	 * 注册同事
	 */
	public void registerColleague(Colleague colleague) {
		if(colleague instanceof ColleagueA){
			this.colleagueA=(ColleagueA) colleague;
		}
		if(colleague instanceof ColleagueB){
			this.colleagueB=(ColleagueB) colleague;
		}
		if(colleague instanceof ColleagueC){
			this.colleagueC=(ColleagueC) colleague;
		}
	}
	/**
	 * 发送信息
	 * @param:colleague:同时对象
	 * @param:mes:传递的内容
	 */
	public void deliverMes(Colleague colleague, String[] mes) {
		if(colleague==colleagueA){
			if(mes.length>=2){
				colleagueB.receiverMes(colleague.getName()+mes[0]);
				colleagueC.receiverMes(colleague.getName()+mes[1]);
			}
		}
		else if(colleague==colleagueB){
			if(mes.length>=2){
				colleagueA.receiverMes(colleague.getName()+mes[0]);
				colleagueC.receiverMes(colleague.getName()+mes[1]);
			}
		}
		else if(colleague==colleagueC){
				if(mes.length>=2){
					colleagueA.receiverMes(colleague.getName()+mes[0]);
					colleagueB.receiverMes(colleague.getName()+mes[1]);
				}
		}
	}
}

以上是对中介模式具体结构的一个举例描述。

        用以上描述,我们可以知道,中介者模式可以避免许多对象之间为了通信而相互显式引用,便于系统的维护工作。对于一个群众需求量比较大的交互网落,一个具体中介者模式就可以将大量有需求的群体联系起来,节约了资源。因此,对于对象以复杂的方式交互,例如A的对象调用B的对象,B中又用到了C的对象,C要调用A的对象,对于这种情况,就可以用中介者模式,减轻各个类之间的依赖程度,便于理解和调试差错。

        在日常生活中,我们熟悉的十字路口的交通信号就是一个由中介者模式设计的。在十字路口,东西走向和南北走向各有一组由红黄绿组成的信号灯。而这些灯的开闭又统一由一的控制器(中介者)控制完成。
        以下是我的模拟交通信号的UML类图结构


       在做这个模拟交通信号项目时,首先要熟悉交通信号灯的规则,即:东西绿灯亮,南北红灯亮;东西红灯,南北黄灯;东西红灯,南北绿灯。
        因此,每一个信号灯都应该有on();和off();的方法,而中介者即对交通规则的设计,是通过一个线程来控制路灯的关闭,另外,中介者一个重要的方法就是要注册控制的几盏信号灯。当然还可以加入一些附带的功能,如根据不同路段,设计红绿灯的交替时间,这也是是通过一个中介者模式建立起来的。最后,路面的显式界面是一个大类,是几个类的集合。详细代码请见附件  TransportSignLight.rar。
        用中介者模式做的模拟交通信号的界面:



       
         从以上实例中可以总结出,中介者模式无非是在较多的对象中添加一个管理者,对这些对象进行统一管理,并给这些需要相互联系的对象提供交流的通道和途径,实现传递信息的功能。

在23种设计模式中,除了中介模式外,现在用到比较多的还有工厂模式:
命令模式:
命令模式结构的四种角色:
接收者(Receiver):负责执行与请求相关的操作
命令(Command)接口:规定用来封装“请求”的若干个方法
具体命令(ConcreteCommand):具体命令是实现命令接口 的实例
请求者(Invoker):请求者是一个包含命令接口的一个实例。请求者中的Command接口的变量可以存放任何具体命令的引用。请求者负责调用具体命令,让具体命令执行那些封装了请求的操作。
  • 大小: 14.7 KB
  • 大小: 26.6 KB
  • 大小: 84.4 KB
  • 大小: 21.4 KB
分享到:
评论

相关推荐

    eda交通信号灯设计实例

    eda交通信号灯设计实例 本设计是一个eda课程设计的应用实例,旨在控制主干道与支道的交通灯。该设计使用了红绿黄三色信号灯,红灯禁止通行,绿灯允许通行,黄灯则给行驶中的车辆提供时间行驶到禁行线之外。 在这个...

    数字电路课程设计之----交通信号灯

    【交通信号灯控制器设计】是数字电路课程设计的一个典型实例,旨在帮助学生理解和应用数字电路原理来解决实际问题。设计的目标是创建一个红绿黄三色LED交通灯系统,同时配备倒计时显示,以便更有效地管理交通流。...

    java课设--交通信号灯

    8. **设计模式**:为了使代码更易于维护和扩展,开发者可能会应用一些设计模式,如单例模式(用于控制信号灯的唯一实例)、观察者模式(用于更新用户界面)等。 9. **文档注释**:良好的编程实践还包括编写清晰的...

    毕业设计----plc交通信号灯控制设计.doc

    通过编写程序,可以设定红绿灯的时序,根据交通流量自动调整信号灯的运行模式,从而提高道路通行效率。 2. 十字路口交通灯控制优化 十字路口是城市交通的关键节点,其交通灯控制直接影响到交通流量的疏导。学生在...

    Multisim数字模拟电路仿真实例源文件- 交通信号灯 60(5)-45(5)电路.zip

    《Multisim数字模拟电路仿真实例:交通信号灯60(5)-45(5)电路解析》 在电子工程领域,电路仿真工具扮演着至关重要的角色,它可以帮助工程师们在实际制作电路前,先在虚拟环境中进行设计、测试和优化。Multisim是一...

    软件设计模式与体系结构(讲解+代码)

     【例4.16】状态模式-交通灯信号灯-设计2  【例4.16】状态模式-交通灯信号灯-设计3 下篇:软件体系结构例子代码  【例6.4】结构化设计-文件更新-C源代码  【例6.5】面向对象设计架构-文件更新  【例6.7】...

    体系结构学习代码!特别详细丰富

     【作业4.4-1】-中介者模式-商业信息共享  【作业4.5-1】-策略模式-排序  【作业4.5-2】-策略模式-属相  【作业4.6-1】-状态模式-天气  【作业4.6-2】-状态模式-税收 (2)下篇:软件体系结构  【作业...

    红绿黄十字路口交通信号灯Multisim仿真设计实例源码文件.zip

    本设计实例通过Multisim软件,模拟了一个十字路口的交通信号灯控制系统,旨在帮助学习者理解和掌握电路设计、数字逻辑以及Multisim的使用方法。 Multisim是一款强大的电子电路仿真软件,广泛应用于教学和工程设计...

    《Visual C/C++系统开发典型实例解析》-源代码-part3

    《Visual C/C++系统开发典型实例解析》-源代码-part3

    计算机组成原理实验-数字逻辑---交通灯系统设计(HUST)-12个题

    交通灯系统的设计是理解数字电路、逻辑门、组合逻辑和时序逻辑的重要实例,它能帮助我们掌握如何用硬件实现基本的控制逻辑。 一、交通灯系统概述 交通灯系统是城市交通管理的核心组成部分,通过红绿黄三色灯的交替...

    单片机C语言实例--147-交通灯测试.zip

    在这个实例中,单片机可能被用来控制交通灯的红绿黄灯交替,实现交通信号的自动化。 2. **C语言编程**:C语言是一种通用的、面向过程的编程语言,特别适合于编写系统软件和嵌入式应用。在这个实例中,`交通灯实例.c...

    147-交通灯测试(51单片机C语言实例Proteus仿真和代码)

    147-交通灯测试(51单片机C语言实例Proteus仿真和代码)147-交通灯测试(51单片机C语言实例Proteus仿真和代码)147-交通灯测试(51单片机C语言实例Proteus仿真和代码)147-交通灯测试(51单片机C语言实例Proteus仿真和代码)...

    交通灯信号控制单片机设计实例

    本篇文章将详细介绍一个交通灯信号控制的单片机设计实例,探讨如何通过单片机的定时器功能和中断机制实现交通灯的自动化控制。 首先,我们来了解硬件设计部分。设计中所采用的51系列单片机因其成本低廉、性能稳定、...

    红绿黄十字路口交通信号灯Multisim仿真设计-实例源文件.zip

    总的来说,这个Multisim仿真设计实例为学习者提供了一个实用的平台,不仅能够深入理解交通信号灯的工作机制,还能提升数字电路设计和分析的能力。通过实践操作,可以更好地掌握数字逻辑电路在实际工程问题中的运用,...

    《Visual C/C++系统开发典型实例解析》-源代码-part2

    《Visual C/C++系统开发典型实例解析》-源代码-part2

    实例解析 Bellman-ford和Spfa算法.docx

    。实例解析。。Bellman-ford和Spfa算法.docx

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

    - **3.6 Mediator模式**:中介者模式用一个中介对象来封装一系列的对象交互。中介者模式使得各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 - **3.7 Command模式**:命令...

    基于S7-1200 PLC的交通灯控制设计方法研究.pdf

    在实际的交通灯控制系统中,还可能会涉及到一些特定的功能,如故障检测、紧急模式切换、行人过街信号控制等。这些功能的实现需要设计者在基本的控制逻辑上进行扩展和优化,以满足更为复杂的实际应用需求。 总之,...

    C语言高级实例解析--书籍pdf.part05

    因为本pdf书籍是扫描版的图片,书籍体积比较大,共part01--part13,请全部下载后解压。 如果谁找到比较好的版本请传我一份,got_fox@yahoo.com.cn,谢谢!

    设计模式精解-GoF23种设计模式解析附C++实现源码

    - 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互,降低系统的耦合度。 - 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复...

Global site tag (gtag.js) - Google Analytics