1 理解接口与实现的区别
以上一篇文章的电视机需要插电使用的例子继续来讲解:请求对象(电视机),接口(插座),实现(发电厂)
对电视而言,插电使用,只需要标准的插座即可,具体的电从哪里来,是火力发电厂,或是太阳能发电,亦或是畜电池逆变供电,电视机是不需要关心的。
发电厂或供电设备属于实现,220V交流电插座属于接口。改变实现不会对电视机的使用产生影响,而改变接口则会。
- 接口:呈现给外部使用的服务属于接口,进一步将,只需要呈现需要使用的接口。实现:实现的细节对外部是进行隐藏的,对代码编写来说,修改实现是不需要变动用户代码的。
2 使用抽象思维设计接口
面向对象编程的一大优势,是可以重用类,而这些可重用的类,接口通常比较抽象。
- 具体接口:功能明确抽象接口:通用性高
举个例子:创建一个出租车对象,有抽象接口(送到机场)和具体接口(左转、右转、启动、停止)
对于抽象接口,送到机场,不管是在哪座城市,哪个位置,都可以到达机场,只是具体的路径可能会不一样。
对于具体接口,左转、右转、启动、停止,在每个城市,或每个位置,都需要具体的指明如何到达。
对比来看,抽象接口,更具有通用性。
3 思考过程
在设计类时,为了尽量隐藏内部原理,需要遵循一些规则:
- 只提供需要的接口,也意味着提供的接口尽可能少只有真正需要时才添加接口,不提供超出需求的接口可以先将接口都定义为私有,在开始使用该类时,将需要开放的接口改为公有
3.1 确定用户
在出租车的示例中,用户是实际使用系统的人,那用户具体是指谁呢?
对于要打车的人,确实属于用户。
对于出租车司机,想对于出租车这个对象来说,司机也属于客户。
注意:这里实际有3个对象:出租车、打车的人、司机
然后用户是2个:打车的人、司机
3.2 对象行为
确定出用户之后,还要确定对象的行为。
确定对象行为,就是要从每个用户视角,分析每个对象的目的以及需要做的事情。
3.3 环境约束
对象的功能可能会受到环境的影响,例如,在出租车的例子中,司机不能通过座坏了的桥,即使是最短的路径。
3.4 识别公共接口
以租车对象为例,使用该对象时,需要的过程包括:
- 上车指明目的地付车费下车
对于打车的人,如果要打车,需要:
- 确定要去的地方打车给司机付钱
在程序设计开始,只需要先考虑如何使用这个对象,先不用考虑如何构建这个对象。在思考的过程中,可能会发现该对象需要一些额外的接口,比如:把行李放到后备箱等。
下面是一个Cabbie(出租车司机)的类图,描述了其可用的方法。
3.5 识别实现
在公共接口确定了之后,接下来才是实现的过程。对于非公共接口,都可以认位是实现。
用户不需要看到具体的实现过程。公共方法中的代码,也属于实现,用户只能看到接口。
- 接口代表了用户如何看待对象实现则是对象的具体细节
4 总结
本篇介绍了面对对象的程序设计中,如果以对象的方式进行思考,包括理解接口与实现的区别,使用抽象思维设计接口,以及具体的思考过程。