OOA&OOD总结
今天看完了马士兵老师的OOA与OOD,也就是面向对象的分析与设计,也不知道到底还存有多少印象,把能想起来的就写下来吧。
老师首先提出了这样一个问题,让大家加以描述。问题只有两句话:小孩在睡觉,醒来后要求吃东西。老师提问了很多人,大家基本就是按照老师以前讲类的设计原则,即名字一般作为类或类的属性,动词一般作为方法。(这也是今天想要强调的一个设计技巧)将这句话分为了三个类,一个class Child,一个class Dad,一个class Test.
版本一就是在class Dad里起一个线程,不停的监测小孩有没有醒,这种设计方法很费内存,效率很低,于是老师给出了第二个版本,化被动为主动,具体实现就是在class Child 起一个线程,这样只要小孩一醒,线程就会使他原本的boolean wakenUp变量变为true。
根据设计的一个原则,就是类的可扩展性,如果按照上面的方法,我们就只要处理Dad在小孩醒后的反应,那么如果我们还要处理小孩爷爷,奶奶,叔叔等的反应,这样不停的写上重复一致的处理代码,将会是class Child 里面的处理代码出现冗余,根据设计的第二个原则就是当代码里出现了重复的代码,你就要考虑要不要将重复代码抽象为一个类了,这样我们就在class Chila 里面添加了一个监听类的容器(注意考虑这里不用数组的原因),小孩一醒就添加各种监听的对象,包括他爸爸,爷爷,奶奶等等,当然还有一个设计原则就是面向对象的一个重要思想就是继承,这里的监听类很多,于是我们必须要采用多继承,这样我们采用了接口的多继承方式,这个监听的接口里含有一个抽象方法,这个方法就是用来描述每一个监听类在小孩醒后采取的行动,然后每一个监听类都可以实现这个接口重写这个抽象方法。
在版本二里面还有几个问题,我还不明白,第一个,在这个版本里老师用到了一个wakenUpEvent这个类,这个类的具体意义不知道自己揣测的是否正确,觉得是不是为了将小孩醒与各种监听类之间联系起来,这个类往监听类的方法里传入的小孩醒的时间,地点等信息,这样更符合面向对象的思想吧。第二个问题就是老师使用的属性文件来保存了和各种类,这样以后引入类或导出类时就变得方便了很多,直接去修改属性文件就行,虽然我还不很懂属性文件的使用,但是里面有一个思想我觉得很值得我学习,就是利用了一种通常用来提高效率的思想,就是缓存的思想。缓存,按照我们计算机组成原理里所说的就是将东西放到他的上一级存储设备里,在这里就是将硬盘的东西放到内存里,我们都知道访问内存的时间要比访问硬盘的速度快很多倍,如果我们将那种不变的,但是又要经常被访问的东西从硬盘里放到内存里,不仅节省了访问时间还能节约空间,从而提高了访问的效率。所以在这里面老师将从硬盘的访问得到的东西放到了一个静态的变量里存储着,还有一点也很值得称赞的是老师将那种每次增加一个监听类都要在执行一遍的方法放到了一个static{}里,这就是传说中的静态初始化代码,静态初始化代码只被执行一次,将结果保存在静态变量里。
老师在这一节还举了一个例子,就是想awt里面的监听事件的内幕给我们深入的挖掘了一番,就butten被按下去这个时间将java内部的实现给写了出来。具体的代码结构如下:butten一个类,actionEvent一个类,还有就是一个antionListener这样一个接口,与上面的小孩模式非常的相似。
以上主要是从例子着手,通过这次的学习,我对“合适的方法要放到合适的类里。”这句话又有了更深一层的理解。所以在设计类时一定要考虑三个方面:类的属性,方法,以及类与类之间的关系。还有一个很深的感触就是关于OOA与OOD的理解,通俗一点的将就是首先你要确定的你的需求是什么,我想这就要你和你的客户深入的沟通吧,该问的还是要问,确定完了你就要设计结构来进行实现。在设计模式来实现时,又要注意了设计模式运用的代价,设计模式的运用,会使类的复杂度增加,当然也会使你的开发成本增加,唯一的优点就是会使你的维护成本降低。所以设计模式也需要慎用。
从这里还暴露出一个问题,就是我们院一直提倡的做中学的思想在我的学习中并没有得到很好的运用,以前学的j2se的基础,比如说线程的使用和监听类的使用都变得比较陌生了,自己看来还要回过去再看一遍。另外老师一直再强掉的设计模式自己其实一点概念都没有,我想下一阶段的学习中还需要将这块空白给补上。
原文链接:https://www.f2er.com/javaschema/288001.html