面向对象设计一一再谈电梯类的实现

上一篇文章讨论如何设计类的使用场景,进而归纳出电梯类的对外接口。今天我们就继续谈谈如何设计电梯类的内部状态、方法以及某些实现。

‌‌‌‌

‌‌

现在我们切换视角,从电梯的使用者,转换到电梯本身。

对于一个电梯,需要知道什么要的信息才能「正确的、有效率的」实现对外方法?举个例子,openDoor方法的具体实现:电梯可以贸然开门么?肯定有很多限制,比如,电梯不能处在运动状态,这个楼层需要在目的楼层、等待楼层的范围内等等。只有掌握了这些电梯内部的信息,电梯对外的方法才能正确的被实现。

那让我们来考虑一下电梯内部的状态有哪些?(思考一下这些状态和外部方法实现的关联)

a. 最大楼层,最低楼层;

b. 运动状态:Idle, Moving, Loading, etc;

c. 当前所在楼层,当前电梯运动方向(up/down)

d. 目的楼层集合;

因此我们简单写一下类的构造函数。

‌‌‌‌‌

下面看对外方法的具体实现,注意分析电梯内部状态和对外行为之间的联系。

openDoor()方法对于电梯楼层相关的状态没有影响,但是修改了电梯的运动状态。另外一方面,开电梯门是一个机械操作,因此我们可以在Elevator类中使用controller的对象,来负责机械操作。

‌‌‌

‌‌‌addDestinationFloor()方法会影响电梯下一步要运行的方向,同时也可能会影响电梯的状态。

‌‌‌

在addDestinationFloor()中,当电梯已经处于Moving状态的时候,elevator的event loop可以正确处理新的请求。如果电梯之前处于Idle状态,那么电梯应该重新启动event loop。对于event loop的实现,一个简单的实现如下:‌

‌‌‌

‌我们没有具体实现hasDestinationFloor()和getNextDestinationFloor(),但是通过电梯内部的currentFloor以及reqFloorList, 这两个方法应该不难实现。

以上是一个简单的电梯类的简单框架实现,它充分的体现了OOP中的重要原则,即封装内部状态,提供对外接口。

作为电梯类的使用者,我们不关心电梯类的内部实现,比如请求的调度算法或者机械功能。使用者关心的是电梯类提供的对外方法接口是否满足使用场景的需求。另一方面,只要能保持电梯类的对外接口不变,它可以自由的修改内部实现。这就是类设计时接口和具体实现的解耦。

OOD完全没有标准答案。我们举出的例子也是为了说明设计类过程中内部状态、方法和对外接口直接的关系。事实上它本身也有很多不足,比如线程不安全(想想如果两个addDestinationFloor同时到达elevator instance会怎样?);很多使用场景的限制没有实现,比如电梯在某一层停留时间有限制,或者有人直接按关门键缩减电梯等待时间等。但只要设计中能体现出OOD的核心原则,面试就基本过关啦。

在面试OOD的过程中,如果有剩余时间,提出可改进的地方,如果能改进其中的一两项,一定加分。

原文发布于微信公众号 - 包子铺里聊IT(baozitraining)

原文发表时间:2015-07-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏韩伟的专栏

互联网开发模式三:持续集成与DevOps

持续集成的意义和实践 不管是敏捷开发的快速迭代,还是重构系统,我们都将频繁的编译代码、部署、测试,也就是所谓的集成。如果我们的系统集成效率太低,那么快速的迭代可...

4546
来自专栏西枫里博客

百度惊雷算法11月20日上线

百度于11月20日上线了惊雷算法,是搜索引擎诸多算法中最近新上线的,目的在于打击页面点击流量欺骗行为。

531
来自专栏SDNLAB

SDN:将NFV引入新境界

要确保网络功能虚拟化(NFV)发挥其最大效能,网络自身需要以虚拟化网络功能(VNF)的形式具备动态和可编程的能力。软件定义网络(SDN)因其可编程能力和便于配置...

3495
来自专栏Cloud Native - 产品级敏捷

Cloud Native-产品级敏捷 2.0: 打造服务化的架构, 使得产品能随著时间、版本的演进, 而能不断的提升其价值与对用户正面的影响力

2017.10.28, Ken Fang, 深圳 I. 前言: 产品级敏捷 2.0 是我在 2016 年所创建的。 创建产品级敏捷 2.0 最主要的目的...

2075
来自专栏Android 开发者

[译] 更好的数据,更明智的决策:Google Play Console 和 Firebase 帮你分析你的用户

作者:Tom Grinsted(Google Play Console 的产品经理)和 Tamzin Taylor(Google Play 西欧区应用及游戏部主...

1552
来自专栏互联网数据官iCDO

【实战101】手把手教你寻找并排除虚假异常流量!

引言:本文结合了作者丰富的互联网数据分析实战经验,深度剖析了如何运用GA来发现,分析并排除虚假和异常流量。

1072
来自专栏SDNLAB

什么是网络功能虚拟化(NFV)

当涉及到网络设备,我们发现传统的专有网络设备越来越多样化,这使得运营商和数据中心运营商们升级服务也越来越困难。网络功能虚拟化(NFV)是源于ETSI行业规范工作...

4635
来自专栏Golang语言社区

简单实用的网游服务器架构 - GameRes游戏新闻网

简单实用的网游服务器架构 此文并不是聚润堂所在公司当前运营的网游游戏服务器架构,而是在看过了近十个商业网游的架构,在现阶段心目中规划的简单实用的网游服务器架...

3545
来自专栏EAWorld

数字化企业云平台的Cloud Native12原则(上)

本文作者介绍了未来云原生应用建设的方法论,开发Cloud Native App的理想实践标准——12要素原则的前6个原则,并围绕数字化企业云平台讲述了具体实践方...

3136
来自专栏SDNLAB

提升云NFV基础设施的运营效率

从2015年到2021年,移动数据流量将增长高达10倍以上。数据和新服务的需求大量涌现,数据和需求的来源不仅来自智能手机,还保留物联网(IoT)设备。电信运营商...

3005

扫码关注云+社区

领取腾讯云代金券