第一至五周Java学习内容总结
时间如白驹过隙,眨眼间便已过去整整五周。在这五周的时间里,我们主要学习了Java的类设计的相关知识,具体内容包括类与对象的关系、对象交互的方式、类的继承与多态以及对象容器。
同时在课下,我们还进行了7次实验和5次作业,熟悉了面向对象设计中的五大基本原则和Java 中最简单的设计模式之一的单例模式。以下我将以时间顺序介绍每周的阶段性学习重点。
第一周:
在本周,我们主要学习了Java的基础语法和简单的类与对象的关系,为了让我们感受到面向对象的程序设计的优势,了解不同编程语言之间的差异性,本周的作业定为了“用三种编程语言设计汽车雨刷的操作系统”。

作为初学者,我在使用Java编程时依然采用了以往的编程方式,以下是我的第一次作业中Java代码的类图:
可以看到,全部功能的实现仅使用了一个类,所有预设功能功能都被涵盖在一个类中,这样的结构无疑是非常致命的。
第二周:
相较于第一周,本周学习的内容更多也更为专业。在本周,我们学习了类与对象的象征意义,同时接触到了面向对象设计的七大设计原则之一的单一职责原则(SRP),作为验收成果,本周我们需要依据单一职责原则重构第一周作业雨刷问题,采用面向对象技术,合理设计实体类、业务(控制)类、接口类及各个类之间的关系。
所谓单一职责原则指的是:一个类只允许有一个职责,即只有一个导致该类变更的原因;也就是说,根据单一职责原则,一个函数(方法)只做一件事情。如果发现一个函数(方法)里面有不同的任务,则需要将不同的任务以另一个函数(方法)的形式分离出去。因此在本周的作业中,我将上周的作业代码中的各项函数都剥离出来,并分别设计了实体类Brush、Lever、Dial以及接口类Machine和业务类Control来承载它们。其中Machine类为连接驾驶员和主控系统Control类的桥梁,Machine接收驾驶员的操作,并转化为相应的计算机指令发送给Control;Control接收到指令后将下发相应的指令到Lever、Daily和Brush,其中Machine模拟的是人对汽车的机械操作,如按下雨刷档位开关,而Control将这些机械操作转化为雨刷等的控制元件能听懂的计算机指令,从而真正改变雨刷的摆动速度,实现驾驶员的需求。以下是我该次实验最终代码的类图。
第三周:
在本周的学习中,我们主要学习了对象交互的方式、类的封装和迪米特法则(LoD),而本周作业同样是基于本周所学内容改进上周的雨刷系统的代码。
迪米特法则也叫做最少知道原则(Least Know Principle),一个类应该只和它的成员变量、方法的输入、返回参数中的类作交流,而不应该引入其他的类(间接交流)。也就是说,类与类之间不能出现某一个类直接访问或修改其他类中的变量的情况,如上周的作业代码,我设计的Control类中,setLever等函数可以直接访问并修改Lever等类中的参数,这种行为是迪米特法则所不允许的。为了实现迪米特法则,我们往往采用将类封装,将属性私有化的方法,使类的私有属性仅能通过预先设计好的getters和setters来访问或修改。
而在本次作业中,我新增了Input、Output和Driver类以更真实地模拟现实中司机控制雨刷的情况。整个程序的运行逻辑是由Input接收用户希望司机执行的动作,然后Input将接受到的信息传递给Driver,Driver将相应的机械指令传达给CentralControl类(原Machine类),CentralControl则将机械指令转化为对应的计算机指令,再通过Control传递给Brush等底层单元,从而修改雨刷摆动速度,并最终由Output类将雨刷当前的实际摆动速度输出。
以下便是我改进后的代码的类图。
第四周:
本周主要学习了类的继承与多态,同时接触了程序设计的两中常用设计模式:MVC模式和单例模式。
类的继承与多态可谓是面向对象的程序设计中相当重要的一环,因为它们涉及到了后期我们将学到的三大设计原则:开闭原则、里氏替换原则与合成复用原则。在类的继承中,父类指的便是模板类,所有的子类都需以父类为蓝本,并进行进一步的完善。不过本周的作业并没有用到这方面的知识,而仅仅是重构第三周作业雨刷问题,使之符合MVC模式,并尝试嵌入单例模式。
所谓单例模式,指的是一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
具体的代码实现为将构造方法私有化,在创建类的同时创建一个唯一的静态对象,并设置公开的getter和setter来获取和修改这个对象,当该对象被get时,程序会检测该对象是否已经被实例化,如果是则直接返回该对象的引用,反之便先实例化该对象再返回其引用。这样一来,由于构造方法私有化,无法通过new实例化更多的对象,任何操作都只能在那个唯一的静态对象上实现。

下面附上本次作业的类图。
第五周:
本周学习的内容较多,主要有对象容器、开闭原则、里氏替换原则、依赖倒置原则和合成复用原则,而本周的作业为:依据单一职责原则、迪米特法则、开闭原则、里氏替换原则、依赖倒置原则与合成复用原则重构第四次作业雨刷问题,需求变更为该系统可以适用多种雨刷系统,采用面向对象技术,再次合理设计实体类、业务(控制)类、接口类、各个类的抽象父类以及相互的关系。
本周作业主要用到了上周所学的类的继承与多态的相关知识。对此,我的思路是将上周作业代码中的各类的细节剥离,只保留骨架和一些所有子类都一定会用到的函数,做成抽象父类,然后直接按照父类的格式,将剥离出的细节做成该类的子类,如:
上周:

本周:

(父类)

(子类)
以下是本次作业的类图:
至于其他作业(如PTA与慕课)由于对我的学习并未产生开拓性的帮助,故不赘述。以上便是我对前五周的Java学习的总结,感谢阅读。
posted on 2022-04-03 23:45 AQHuiguang 阅读(119) 评论(0) 收藏 举报
浙公网安备 33010602011771号