`

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

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

          在学习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
分享到:
评论

相关推荐

    电镀生产线中西门子S7-300 PLC控制程序详解及其应用

    内容概要:本文详细介绍了应用于电镀生产线的西门子S7-300 PLC控制系统的程序设计、硬件配置以及调试过程中积累的实际经验。主要内容涵盖温度控制、条码记录、行车定位、故障排查等方面的技术细节。文中展示了多个关键功能模块的具体实现方法,如PID温度控制、条码数据处理、行车定位判断等,并分享了一些实用的调试技巧和注意事项。此外,还讨论了硬件配置中的重要细节,如模块地址分配、网络拓扑设计等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程有一定基础的人群。 使用场景及目标:适用于需要深入了解和掌握电镀生产线自动化控制技术的专业人士。目标是帮助读者理解S7-300 PLC在电镀生产线中的具体应用,提高实际项目的开发效率和可靠性。 其他说明:文章不仅提供了详细的程序代码示例,还分享了许多来自一线的真实案例和实践经验,对于解决实际工程中的问题具有很高的参考价值。

    COMSOL仿真中固体超声导波的二维建模与分析:基于汉宁窗调制的200kHz正弦激励信号

    内容概要:本文详细介绍了使用COMSOL Multiphysics进行固体超声导波的二维仿真过程。作者通过建立一个10mm×100mm的铝板模型,应用汉宁窗调制的5周期200kHz正弦激励信号,研究了超声导波在铝板中的传播特性及其模式转换现象。文中涵盖了从模型构建、材料参数设置、网格划分、边界条件设定、激励信号施加到求解设置以及结果分析的完整流程。特别强调了汉宁窗调制的作用,即减少频谱泄漏并提高信号质量。 适合人群:从事超声检测、材料科学、物理学等相关领域的研究人员和技术人员,尤其是那些希望深入了解COMSOL仿真工具及其在超声导波研究中应用的人群。 使用场景及目标:适用于需要精确模拟超声波在固体介质中传播的研究项目,旨在验证理论预测、优化实验设计、评估不同材料和结构对超声波的影响。此外,还可以用于教学目的,帮助学生掌握COMSOL软件的操作方法和超声导波的基础知识。 其他说明:文中提供了详细的参数设置指导和代码片段,有助于读者快速复现仿真过程。同时,作者分享了一些实用技巧,如如何正确设置网格大小、选择合适的窗函数等,以确保仿真结果的准确性。

    离职人员分析仪表盘.xlsx

    离职人员分析仪表盘.xlsx

    基于LabVIEW的多功能虚拟函数信号发生器设计与信号分析

    内容概要:本文详细介绍了如何利用LabVIEW搭建一个多功能的虚拟函数信号发生器及其信号分析功能。首先,文章展示了如何通过LabVIEW的前面板和程序框图创建各种常见波形(如正弦波、方波、三角波等),并深入探讨了波形生成的具体实现方法,包括三角波的周期性和斜率计算、白噪声的生成以及自定义公式的解析。接着,文章讨论了信号处理的关键技术,如自相关分析、频谱分析、积分和微分运算,并提供了具体的实现代码和注意事项。此外,文中还分享了一些实用的经验和技术细节,如避免频谱泄漏的方法、处理多频波的技术、防止内存泄漏的措施等。 适用人群:从事信号处理、电子工程、自动化控制等领域的工作技术人员,尤其是那些熟悉或希望学习LabVIEW编程的人士。 使用场景及目标:适用于实验室环境或教学环境中,用于替代传统物理信号发生器进行信号生成和分析实验。主要目标是提高信号生成和分析的灵活性和便捷性,减少对昂贵硬件设备的依赖。 其他说明:本文不仅提供了详细的代码示例,还分享了许多作者在实践中积累的经验教训,帮助读者更好地理解和应用LabVIEW进行信号处理。

    线性代数_矩阵运算_方程组解释_MIT公开课笔记用途_1742822302.zip

    线性代数

    大雾至尊版V56泛滥无密码.zip

    大雾至尊版V56泛滥无密码.zip

    员工生日关怀方案.doc

    员工生日关怀方案

    试用期情况跟踪表.xls

    试用期情况跟踪表.xls

    员工激励机制与技巧.doc

    员工激励机制与技巧

    员工晋升的自我评价.doc

    员工晋升的自我评价.doc

    基于51单片机protues仿真的多功能婴儿车控制器(仿真图、源代码、AD原理图)

    基于51单片机protues仿真的多功能婴儿车控制器(仿真图、源代码、AD原理图) 该设计为51单片机protues仿真的多功能婴儿车控制器,实现温湿度,音乐,避障,声音监测控制; 1、温湿度检测,婴儿尿湿时会有提醒。 2、声音检测,当婴儿啼哭时也会有提醒。 3、小车避障,小车遇到障碍会后退左转。 4、音乐播放。 5、仿真图、源代码、AD原理图;

    【计算机求职笔试】编程语言基础、数据结构与算法、系统设计等核心考点解析及备考建议介绍了计算机求职笔试

    内容概要:本文档详细介绍了计算机求职笔试的内容与解答,涵盖编程语言基础、数据结构与算法、编程实践与调试、系统设计与软件工程以及综合题型与开放题五个方面。编程语言基础部分强调了语法规则、数据类型与运算符、面向对象编程的核心概念;数据结构与算法部分讲解了常见数据结构(如线性结构、树与图、哈希表)和高频算法(如排序算法、动态规划、递归与回溯);编程实践与调试部分关注编码能力和调试技巧;系统设计与软件工程部分探讨了设计模式、模块化设计、数据库与网络知识;综合题型与开放题部分则提供了场景题和逻辑思维题的示例。最后给出了备考建议,包括知识体系构建、刷题策略和模拟实战的方法。 适合人群:即将参加计算机相关职位笔试的求职者,特别是对编程语言、数据结构、算法设计有初步了解的应届毕业生或初级工程师。 使用场景及目标:①帮助求职者系统复习计算机基础知识,提升笔试通过率;②通过例题和解答加深对编程语言、数据结构、算法的理解;③提供模拟实战环境,提高时间管理和抗压能力。 阅读建议:建议按照文档提供的知识体系顺序进行系统复习,重点攻克高频题型,利用在线平台刷题练习,并结合实际项目经验进行综合应用,同时注意时间管理和抗压能力的训练。

    SecureCRT安装包

    SecureCRT安装包

    物流业人才流失与紧缺现象的对策研究.docx

    物流业人才流失与紧缺现象的对策研究

    招聘渠道费用仪表盘P10.pptx

    招聘渠道费用仪表盘P10.pptx

    五相永磁同步电机Simulink中PI双闭环SVPWM矢量控制建模与优化

    内容概要:本文详细介绍了五相永磁同步电机在Simulink环境下的PI双闭环SVPWM矢量控制建模过程及其优化方法。首先阐述了五相电机相比三相电机的优势,如更小的转矩脉动和更强的容错能力。接着探讨了复杂的Simulink模型搭建,涉及电机本体模块、坐标变换模块、SVPWM模块和PI调节器模块等多个组件。文中提供了具体的Clark变换和PI调节器的代码示例,解释了双闭环控制的工作原理,并详细描述了SVPWM与十扇区划分的具体实现方式。最后展示了模型的性能表现,包括良好的波形质量和快速的动态响应特性。 适合人群:从事电机控制领域的研究人员和技术人员,尤其是对五相永磁同步电机和Simulink建模感兴趣的读者。 使用场景及目标:适用于希望深入了解五相永磁同步电机控制原理并掌握具体实现方法的研究人员和技术人员。目标是帮助读者理解五相电机的特殊性和复杂性,掌握PI双闭环SVPWM矢量控制的建模技巧,提高电机控制系统的设计水平。 其他说明:文章不仅提供了理论知识,还包括了大量的代码片段和实践经验分享,有助于读者更好地理解和应用相关技术。

    员工离职交接表-模板.doc

    员工离职交接表-模板.doc

    离职率高"冰山"下的真相?你知道多少?.docx

    离职率高"冰山"下的真相?你知道多少?

    光伏MPPT中恒定电压法与PID控制结合的技术解析及其应用

    内容概要:本文详细介绍了光伏系统中最大功率点跟踪(MPPT)的一种常见方法——恒定电压法,并探讨了其与PID控制相结合的应用。恒定电压法通过将光伏板的输出电压固定在一个预设值附近,以期接近最大功率点。然而,由于光照和温度的变化,单纯依靠恒定电压法难以精确跟踪最大功率点。因此,引入PID控制器进行动态调整,能够显著提高系统的响应速度和稳定性。文中提供了具体的MATLAB和Python代码示例,展示了如何构建和优化这样的控制系统。同时,还讨论了在Simulink环境中建模时需要注意的关键技术和参数选择。 适合人群:从事光伏系统设计、开发以及维护的技术人员,尤其是希望深入了解MPPT算法原理并掌握具体实现方法的专业人士。 使用场景及目标:适用于需要快速实现MPPT功能的小型光伏系统,特别是在成本受限的情况下。通过学习本文,读者可以掌握恒定电压法的基本概念,学会利用PID控制提升性能的方法,从而更好地应对实际工程项目中的挑战。 其他说明:尽管恒定电压法加上PID控制可以在一定程度上改善MPPT的效果,但它并非最优解。对于更加复杂的环境条件,仍需采用更为先进的算法如电导增量法等。此外,文中提到的一些技巧和注意事项有助于避免常见的错误,确保仿真的准确性。

    基于蒙特卡洛算法的风光出力预测与场景削减技术在电力系统中的应用

    内容概要:本文详细介绍了利用蒙特卡洛算法进行风光出力预测的方法和技术。首先,通过威布尔分布和Beta分布分别模拟风速和光照强度的变化,生成大量的不确定场景。然后,为了减少计算复杂度并提高实用性,采用了K-means聚类算法对生成的大量场景进行削减,提炼出少数典型场景及其发生的概率。此外,还讨论了如何通过标准化处理解决不同量纲的问题以及如何引入时间相关性以增强模型的真实感。最后,提供了完整的代码实现和一些实用的调参建议。 适用人群:适用于从事电力系统规划、调度工作的专业技术人员,尤其是那些希望深入了解风光出力预测方法论的研究者和从业者。 使用场景及目标:本方法旨在帮助电网调度员更好地理解和应对由风速和光照引起的电力供应不确定性,从而制定更加科学合理的电力调度计划。具体应用场景包括但不限于短期负荷预测、电力市场交易决策支持等方面。 其他说明:文中不仅给出了详细的理论解释和技术实现步骤,还分享了许多实践经验,如选择合适的分布模型、调整参数以适应特定地区的气象条件等。同时强调了在实际应用过程中需要注意的一些潜在问题,例如确保数据的质量和准确性、考虑计算效率等因素。

Global site tag (gtag.js) - Google Analytics