电梯系统OO设计

[OOD设计] - 电梯系统设计 OOD设计总结 - 电梯系统设计 阅读详情

理论上应该先黑盒用例,分析需要求,系统边界的输入输出,再白盒类图。 但是对于现实世界模拟的OO,个人感觉先emulate现实世界,初步识别类和类之间的关系,再用用例和顺序图丰富、修正类图。

识别类,最主要的原则是封装,数据和数据的操作封装成一个类:

轿厢 box:封装轿厢的状态:位置、方向、静止还是运动,capacity,  pickup列表,目的地列表

楼building:用户请求电梯的媒介,和轿厢box有个一对一关联关系,向轿厢box发call消息,轿厢到达某层,向building发某层open的消息。

从控制驱动的角度,有2种控制流(主动对象)

1)轿厢box:不停地运转,根据请求的情况,运行或者停止等待信号

2)人:1是人向building发消息,building再 forward到box;2)是人向轿厢发消息,设置要去的目的地楼层

和VODController类似,内部一个驻留线程,类似一个状态机运行着,同时多个点可以接收异步消息更新数据。

亮点是一个事件机制,每经过一层,触发一个positionChanged的事件

总结:OO系统,就是一个互相发消息的对象系统,对象之间靠消息交互

常见的控制流模型:

1) 顺序执行,exit

2)无专门驻留线程,完全消息驱动,类似一般的web service,request/response模式。

3) 有一个驻留线程在run, (定时运行或者受信号控制),同时也可以接受异步消息更新数据,为社么说是异步消息,因为它只是通过update数据来影响状态机的运行,不需要返回什么结果。基于工作队列的处理系统也属于这种模型,但更简单,FIFO处理就行,电梯模型的复杂在于,系统会根据当前所有request的情况做一个调度,并不是简单的FIFO。

class Box {
	int direction; // 0 up, 1 down, 2 stopped
	int currentPos; //current position
	int capacity;  // max load
	final static int   MAX_FLOOR = 100;
	volatile boolean destinations[] = new boolean[MAX_FLOOR]; 
	volatile boolean pickups[][] = new boolean[MAX_FLOOR][2]; //0 for up, 1 for down
	int highestTo = -1; // the farest upper floor to go
	int lowestTo = -1; // the farest lower floor to go
	volatile boolean on = true; //on or off
	Building building;
	int numRequest = 0;
	Object signal = new Object();
	
	public void call(int floor, int direction) { 
		synchronized(signal) {
			if (!pickups[floor][direction]) {
				pickups[floor][direction] = true;
				++numRequest;
				if (highestTo < 0 || floor > highestTo) highestTo = floor;
				if (lowestTo < 0 || floor < lowestTo) lowestTo = floor;
				signal.notify();
			}		
		}
	}
	public void setDestination(int floor) {	
		synchronized(signal) { 
			if (!destinations[floor]) {
				destinations[floor] = true;
				++numRequest; 
				signal.notify();
			}		
		}
	}
	public void shutdown() { 
		on = false; 
		synchronized(signal) {			
			signal.notify();
		}
	}
	
	private void open() {building.open(currentPos); /*first open the building door, then the box's*/ } 
	private void close() {building.close(currentPos);}
	private void stop() {}
	private void positionChanged() {	
		if (pickups[currentPos][direction] || destinations[currentPos]) {
			stop();
			open();
			//Thread.sleep(5000);
			close();
			synchronized(signal) {
				if (pickups[currentPos][direction]) {pickups[currentPos][direction] = false; --numRequest;}
				if (destinations[currentPos]) {destinations[currentPos] = false; --numRequest;}
				if (highestTo == currentPos) highestTo = -1;
				if (lowestTo == currentPos) lowestTo = - 1;
			}
			//resume();
		}
	}
	private void run() {
		while (on) {
			synchronized (signal) { 
				if (numRequest == 0) {
					direction = 2; //stopped
					signal.wait(); //wait signal here if no jobs to do					
				}
				//decide up or down, handle upper request first.
				if (highestTo > 0 ) direction = highestTo > currentPos ? 0 : 1;
				else if (lowestTo > 0) direction = lowestTo < currentPos ? 1 : 0;
			}
			
			if (direction == 0) { //up
				for (int i = currentPos + 1; i <= highestTo; ++i) {
					++currentPos;
					positionChanged();
				}
			}
			else if (direction == 1) {//down
				for (int i = currentPos - 1; i >= lowestTo; --i) {
					--currentPos;
					positionChanged();
				}
			}
			
		}
	}
}
//楼building:用户请求电梯的媒介,和轿厢box有个一对一关联关系,向轿厢box发call消息,轿厢到达某层,向buildng发某层open的消息。
class Building {
	Box box;
	public void call(int floor, int direction ) { box.call( floor,  direction);}
	public void open(int floor) {}
	public void close(int floor) {}
}



UML电梯系统类图 用EA绘制的电梯系统类图,打开就可以直接使用。是UML初学者的优秀参考资料 立即下载

相关推荐

UML状态图(WINDOWS GUI及电梯)

本文档是针对三个题目要求完成的UML状态图设计,文中UML状态图均使用VISIO完成绘图,三个状态图分别为WINDOWS GUI状态图、WINDOWS GUI工作状态图及电梯状态图。

电梯控制系统的设计与实现

电梯控制系统(汇编实现)

一名混沌的大学生 9605

模拟电梯系统程序设计

八、 实验内容和要求: 要求根据下面的功能说明描述实现模拟电梯控制软件 (一)电梯配置 1. 共有1个电梯 2. 共有maxfloor层楼层。maxfloor=9。 3. 中间层每层有上下两个按钮,最下层只有上行按钮,最上层只有上行按钮。每层都有相应的指示灯,灯亮表示该按钮已经被按下,如果该层的上行或者下行请求已经被响应,则指示灯灭 4. 电梯内共有maxfloor个目标按钮,表示有乘客在该层下电梯。有指示灯指示按钮是否被按下。乘客按按钮导致按钮指示灯亮,如果电梯已经在该层停靠则该按钮指示灯灭 5. 另有一启动按钮(GO)。当电梯停在某一楼层后,接受到GO信息就继续运行。如果得不到GO信息,等待一段时间也自动继续运行。 6. 电梯内设有方向指示灯表示当前电梯运行方向。 说明:由于本次实验不使用可视化框架,所以无法作到从图形界面上获取按钮请求。因此电梯按钮的设计,不在图形界面上体现,仅用来设计键盘的模拟输入。 (二)电梯的运行控制 1.电梯的初始状态是电梯位于第一层处,所有按钮都没有按下。 2.乘客可以在任意时刻按任何一个目标钮和呼叫钮。呼叫和目标对应的楼层可能不是电梯当前运行方向可达的楼层。 3. 如果电梯正在向I层驶来,并且位于I层与相邻层(向上运行时是I-1层或者向下运行时是I+1层)之间,则因为安全考虑不响应此时出现的I层目标或者请求。如果电梯正好经过了I楼层,运行在I楼层和下一楼层之间,则为了直接响应此时出现的I层目标或者请求,必须至少到达运行方向上的下一楼层然后才能掉头到达I楼层(假设掉头无须其它额外时间),如果I楼层不是刚刚经过的楼层则可以在任意位置掉头,此时掉头后经过的第一个楼层不可停。 4. 电梯系统依照某种预先定义好的策略对随机出现的呼叫和目标进行分析和响应。 5. 乘客数量等外界因素(可能导致停靠时间的长短变化)不予考虑。假设电梯正常运行一层的时间是5S,停靠目标楼层、上下乘客和电梯继续运行的时间是5S。 6. 当电梯停靠某层时,该层的乘客如果错误的按目标或呼叫按钮都不予响应。 7. 电梯停要某一层后,苦无目标和呼叫,则电梯处于无方向状态,方向指示灯全灭,否则电梯内某个方向的指示灯亮,表示电梯将向该方向运行。等接到“GO”信号后电梯立即继续运行。若无GO信号,则电梯在等了上下乘客和电梯继续运行时间后也将继续运行。 8. 当一个目标(呼叫)已经被服务后,应将对应的指示灯熄灭。 (三)电梯运行的控制策略 以下是几个候选策略: 1.先来先服务策略: 将所有呼叫和目标按到达时间排队,然后一一完成。这是相当简单的策略,只需要设计一个将呼叫和目标排队的数据结构。因为该策略效率也很低,所以没有实际的电梯采用这种策略。 2. 顺便服务策略: 顺便服务是一种最常见的简单策略。这种策略在运行控制中所规定的安全前提下,一次将一个方向上的所有呼叫和目标全部完成。然后掉转运行方向完成另外一个方向上的所有呼叫和目标。 可以采用设定目标楼层的办法来实现这个策略,即电梯向一个目标楼层运行,但这个楼层可以修改。具体策略如下: 1) 修改目标楼层的策略: a.如果电梯运行方向向上,那么如果新到一个介于当前电梯所处楼层和目标楼层之间,又可以安全到达的向上呼叫或者目标,将目标楼层修改为这个新的楼层。 b.如果电梯运行方向向下,那么如果新到一个介于当前电梯所处楼层和目标楼层之间,又可以安全到达的向下呼叫或者目标,将目标楼层修改为这个新的楼层。 2)确定新的目标楼层: 如果电梯向上运行,当它到达某个目标楼层后,则依照以下顺序确定下一个目标楼层: a.如果比当前层高的楼层有向上呼叫或者目标,那么以最低的高于当前楼层的有向上呼叫或者目标的楼层为目标。 b.如果无法确定目标楼层,那么以最高的向下呼叫或者目标所在楼层为电梯当前目标楼层。 c.如果无法确定目标楼层,那么以最低的向上呼叫所在楼层为电梯当前的目标楼层。 d.如果仍然不能确定目标楼层(此时实际上没有任何呼叫和目标),那么电梯无目标,运行暂停。 如果电梯向下运行,依照以下顺序确定下一目标楼层: a.如果比当前层低的楼层有向下呼叫或者目标,那么以最高的低于当前楼层的有向下呼叫或者目标的楼层为目标。 b.如果无法确定目标楼层,那么以最低的向上呼叫或者目标所在楼层为电梯当前目标楼层。 c.如果无法确定目标楼层,那么以最高的向下呼叫楼层为目标楼层。 d.如果仍然不能确定目标楼层(此时实际上没有任何呼叫和目标),那么电梯无目标,运行暂停。 3)最快响应策略: 响应所有的现在存在的所有呼叫和目标所需时间(采用不同方案电梯停靠时间相同,所以不必考虑)最短的策略。 可选方案一是电梯先向上运行响应经过各层的目标和向上呼叫,再向下运行响应所有向下呼叫以及途经各层的目标,最后再向上响应剩余的向上呼叫。二是恰好相反,

毕业设计 基于51单片机的电梯控制系统的设计

STC89C52有两种封装形式。在本设计中采用直插式的DIP40的封装,这种封装的好处就是当遇到高温的时候可以防止芯片被高温所损害,STC89C52一共具有40只引脚,其中有32只引脚可以用来控制[14]。1.1.2 单片机引脚的说明VCC(40引脚):作用是电源电压VSS(20引脚):作用是接地P0口:为8位准双向接口,它的每一个接口都具有双向输入和输出功能,它可以一共启动四个负载。P1口:为8位准双向接口,它的每一个接口都具有双向输入和输出功能,它可以一共启动四个负载。

Nueve_Y的博客 1656

UML 电梯系统建模

本文档介绍的是基于UML电梯系统的建模,可以参考!

JavaOO笔试题(很多陷阱)

很多题有陷阱,细心去做会有很大收获!很多题有陷阱,细心去做会有很大收获!

电梯停车场扑克牌--三大经典OOD详解之电梯(一解)

电梯: 以OOD方式设计一个电梯。 解答: 首先我们要想一下,电梯是什么?应该有什么属性和功能? 属性的话就是电梯的状态,比如说停在了几楼,现在是停止还是移动的状态,往上移动还是往下移动,移动的目标楼层。 有没有需要考虑的输入呢?当然是有的。所以我们要有一个请求类,专门用于接受用户请求(以及删除用户请求),以及给电梯提供下一个目标楼层。 既然有输入,那我们也需要一个user类,来使得用户通过这个类提供的接口发出请求。 ...

Tech in Pieces 3001

聚类模型-层次聚类

聚类模型 1、层次聚类 2、原型聚类-K-means 3、模型聚类-GMM 4、EM算法-LDA主题模型 5、密度聚类-DBSCAN 6、图聚类-谱聚类 一、层次聚类 一、聚类理论 ​ 一般来说,聚类是在训练样本的标签信息不知的情况下,学习样本内在的性质和规律,将有限的集合划分成ccc类。根据“方以类聚,物以群分”的思想,类内对象尽可能的相似,...

myazi 6504

【单片机毕业设计】【mcuclub-dz-172】基于单片机的五层电梯自动控制系统的设计

随着社会发展和城市变革,我国城市外来人口不断增加,高层建筑成为城市建设的标志。为满足人们出行和工作的需求,高层建筑引入楼宇自动化和智能化科技,电梯成为不可或缺的运行工具。电梯性能和数量的提升要求日益增高,加强和完善电梯外观和自动化控制系统设计成为现代高层建筑规划的重要任务。本文以五层电梯自动控制系统为研究对象,综合运用单片机、电机、传感器和通信技术,实现了内机和外机的自动控制系统。在内机部分,通过五个独立按键实现电梯内部1-5层的请求,另外两个按键用于开门和关门操作。内部使用四相步进电机模拟电梯开关门和升降

qq_40472627的博客 1318

使用模拟工具Modbus poll 和PLC 通讯

使用模拟工具Modbus poll 和PLC 通讯 简介 Modbus Poll 是一个模拟Modbus 主站的工具。不用在现场调试,在家也能使用,方便快捷的调试验证程序。使用它可以和PLC进行Modbus TCP /RTU 通讯等功能,接下来为大家介绍使用Modbus Poll 和 PLC 进行 Modbus TCP 通讯。 组态PLC PLC作为我们的从站和Modbus Poll 通讯,那我们组态一个PLC。 创建通信DB 创建一个DB块,在数据类型处输入:TCON_IP_V4

weixin_61398412的博客 1万+

DELPHI11 利用Android手机实现条码扫描功能

好了,整个过程全部结束,当然这只是最简单的例子,只是演示一下如何识别条码,更多的条码处理功能,比如优化,提速等需要在后面继续。安装过程中所有提示框全部按OK就可以,直到提示安装成功,那么ZXing库就成功完成了安装。点击红框标识的文件夹图标,将下载的ZXing库文件路径加入进来后,点ADD。第三步:选择下载的ZXing库路径,并按Ctrl + A进行全选,并导入。至此为止,我们的库才算是全部安装完成,可以在DELPHI 中正常引用了。2.打开相机,识别条码,并将条码内容显示在MEMO1中。

1531

OO第二单元作业总结

OO第二单元作业总结 概述 本单元共三次电梯系统设计作业,难度递增,架构可以层层嵌套(每次都设计好的话),趣味颇丰。电梯的款式(奇怪的描述)均为目的选层电梯,即乘客可在电梯外发送自己想要去的楼层。 乘客的请求包括出发楼层和目的楼层与id,每位乘客都有自己独有的id,一个id只能对应一个请求,本单元不需考虑WF检测。 一、设计策略 1.1第一次作业总结 第一次作业电梯名为单部多线程傻瓜调度(FAFS...

weixin_30266829的博客 125

COMSOL实战:如何用有限元法(FEM)准确仿真电磁场问题?避坑指南

本文是一份COMSOL电磁场仿真实战指南,重点讲解如何运用有限元法(FEM)准确模拟电磁场问题。文章通过矩形波导和偶极子天线两大经典案例,详细剖析了从几何建模、物理场设置、网格剖分到结果验证的全流程,并提供了处理非线性材料、求解器收敛失败等高级问题的避坑技巧,旨在帮助工程师建立可靠的仿真工作流。

weixin_29297127的博客 514

BUAA-OO-电梯调度

BUAA-OO-电梯调度 1.设计策略 需求分析 设计一个系统,使其可以根据乘客的当前楼层和目的楼层,为乘客分配电梯资源并运送其至目的楼层。 自顶向下 根据需求,可以将整个系统分成三个部分: 处理乘客的当前楼层和目的楼层,即输入处理 为乘客分配电梯资源,即调度 运送至目的楼层,即电梯本体 显然,这三个部分是有次序关系的:乘客输入,处理输入,将请求放入调度队列,调度器从调度队列中取出请...

weixin_30556959的博客 417

企业数字化转型的 4A 架构指南:从概念解读到 TOGAF 阶段对应

4A企业架构是中国数字化转型实践中总结的简化框架,包含业务、应用、数据和技术四个架构层。它自上而下形成业务驱动应用的指导关系,自下而上构建技术支撑数据的实现路径,与国际标准TOGAF核心内容高度对应。该模型通过统一语言、战略对齐和系统梳理,有效连接业务需求与IT实施,已成为企业架构规划的实用工具。其分层结构清晰展示了从业务目标到技术落地的完整推导链,特别适合中国企业的数字化转型场景。

友莘居士的博客 2176

36 Agent Memory:如何让智能体记住该记的东西

Agent 会调用工具,只能说明它有了行动能力。要让它跨会话、跨任务持续工作,还需要一套可治理的 Memory 系统。本文讲清上下文窗口、RAG 和 Agent Memory 的区别,以及工作记忆、情景记忆、语义记忆、程序记忆该如何分层设计。

老于的笔记的专栏 90

BUAA_OO_2025_U2

一位苦逼大学生的课程单元作业

2404_88761251的博客 1444

基于泰勒展开改进的物理信息神经网络

基于泰勒展开改进的物理信息神经网络

天天酷科研的博客 504

BUAA-OO-第二单元

本单元我主要学习了多线程编程的思想,主要采用给方法加锁的方式处理数据共享的问题,在实验课上还学习了一些其他的锁,但我自己还没有进一步学习使用。每次作业我的重心都在如何更好地进行层次化设计以及如何保证线程安全上,以下是一些具体思考。

lym13809115249的博客 296

芯片测试:WAT、CP、FT

最近部门来了一个日本回来的同事,虽然他尽量用非常Poor的中文给我解释一些东西,其中还夹杂着一些英文让我很受挫,于是最近来学一下WAT中的常用的单词含义。直接去查缩写、查单词很难去记住,要把具体的东西放在具体的场景,引发知识的连接才会在脑子里留下一定的映像。感兴趣的一起来学习一下这篇不错的文章吧。注释是我查询记录,如有不妥,欢迎指出修正。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 5089

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

北航OO课程 第二单元总结

同步块有RequestQueue类中对请求队列进行读或写的方法块,包括增加请求(addRequest)、删除请求(removeRequest)、获取请求(getOneRequest)以及获取请求队列(getRequests),还有对判断是否结尾的变量isEnd进行修改的方法块(setEnd),以及其他方法中需要进行唤醒某个线程的操作时使用的synchronized代码块。

weixin_64057397的博客 464

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

BUAA-OO-第二单元:电梯调度

电梯调度问题是北航OO多线程题目。通过三次的迭代开发,让我们逐渐理解多线程的并发编程和锁的应用。通过自己完成工程代码,经过自测、中测、强测和互测不断发现bug并给予修复,我逐渐对多线程同步有了更加深入的理解。在完成整项工程之前,有必要先提一提“进程”和“线程”的概念了。是计算机中的程序关于某数据集合上的一次运行活动,它是系统进行资源分配的基本单位,也是操作系统结构的基础。是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

qq_42989558的博客 1030

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

BUAA_OO 第二单元总结

BUAA_OO 第二单元总结 写在前面 ​ 多线程(multi-threading)是指从软件或硬件上实现多个线程并发执行的技术。现代处理器普遍具有多核的特点,支持同一时间执行多个线程,使用多线程技术可以提高程序并发度,整体提高处理性能。因此掌握多线程程序设计技术是CS学习必不可少的一部分。 ​ 多线程程序设计包括线程协同控制、线程安全保证以及线程程序设计模式等。本文主要总结OO课程第二单元所学的...

weixin_30861797的博客 463

BUAA OO 2024Unit2总结

BUAA 面向对象第二单元总结~~

wp040717的博客 2020

BUAA_OO_2024 Unit-2总结

BUAA OO Unit2 Summary

Super_Nova_的博客 866
上一篇: 双指针、单调性的思考
下一篇: 一些OO练习
binling
博客等级 码龄25年 21粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值