面向对象的编程-Application 48

Previously on OOP:

Simulation of the Hydraulics system can be programmed using either centralized or delegation approach. The latter one, first printing the water flow related information and then invoking simulate() method to the output Element(s), is preferred.

本大作业的最后一个requirement是附加题,做不做都不会影响评分。但是本黄鸭还是希望各位宝宝们能做一下,因为这个requirement升华了一下delegation approach。

简单地说,需求是要打印一个像上图一样的、Hydraulics system的布局图。实现这个需求使用的方法是delegation approach。控制权最初在HSystem class中的layout()函数中,这个函数遍历Element[]数组,找到Source,用Source的object reference来调用它自己的layout()函数,也就是把控制权交给Source。Source的layout()函数先把字符串整理好,再加入到一个StringBuffer中。

想要实现这个算法,还有两个问题要考虑清楚:

(1)怎么把每个类中、存放信息的StringBuffer全部append在一起呢?把StringBuffer作为layout()函数的返回值,那么Source的StringBuffer会返回给HSystem class中的layout()函数,Tap的StringBuffer会返回给Source类的layout()函数。相当于每个类要控制的不仅是自己,还有所有output Elements。

(2)Split类应该怎么办?首先,Sink的信息可以用过调用它的layout()函数返回,在“Sink.layout()”调用之后,append一个回车字符,换到下一行,然后敲空格到上一行加号的位置,打一个竖线,再append一个回车字符,etc。

现在还剩下最后一个问题,要敲多少个空格呢?我们可以把前面所有字符串的长度作为参数传给Split类。

以下是代码:

刚才我们讲过,layout()函数的参数是前面所有字符的总长。因为Source是第一个Element,所以参数的值是。

新建一个String类型的local variable,名叫result,里面不仅要管Source自己的信息,还要管从下一个output Element到Sink的信息,所以result由两个部分组成,中间用加号concatenate在一起,如倒数第二行代码所示。

那么,红色的“result.length()”的值是多少呢?应该是上面一行代码中"[" + getName() + "]" + "Source ->"的长度,不是“return result;”中result的长度。

Tap class的layout()函数和Source class中的差不多,Sink比Source class中的更简单,因为不用加上getOutput()...只要返回含有自己信息的字符串就行了。下面,我们重点来看一下Split class中的layout()函数。

Layout()函数接收的参数是Split前面的字符数量,即“[Src]Source -> [R]Tap”的长度,而空格的长度还要包含“[T]Split”字符串的长度,所以表示空格长度的变量length的值应该是:参数indent +result.length()。

“[T]Split”字符串后面的“+-> [”,编写在Sink class中。

第三项大作业Hydraulics的代码虽然已经分析完毕,但是本黄鸭还是要指出两个改进方向:

(1)现在所有Elements的object references都存放在数组中,我们可以把它们都存放到Java Generics中去。因为每个Element不存在unique的标识符,所以不适合使用Map之类的associative container,适合使用Collection之类的group container。

(2)最后两个需求除了可以用centralized or delegation approach之外,还有作用是communication decoupling的observable and observer可以选用。所有的Element的子类都implements Observable,然后HSystem类extends Observer。有兴趣的宝宝们可以在都灵理工大学的课程官网上下载代码,也可以自己试着编写一下代码。

欢迎使用本黄鸭编写的小程序~

微信公众号二维码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181220G10F4F00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券