1 面向对象的软件开发方法简介
面向对象的开发方法把软件系统看成各种对象的集合,对象就是最小的子系统,一组相关的对象能够组合成更复杂的子系统。面向对象的开发方法具有以下优点。
把软件系统看成是各种对象的集合,这更接近人类的思维方式。
软件需求的变动往往是功能的变动,而功能的执行者——对象一般不会有大的变换。这使得按照对象设计出来的系统结构比较稳定。
对象包括属性(数据)和行为(方法),对象把数据和方法的具体实现方式一起封装起来,这使得方法和与之相关的数据不再分离,提高了每个子系统的相对独立性,从而提高了软件的可维护性。
支持封装,抽象,继承和多态,提高了软件的可重用性,可维护性和可扩展性。
1.1 对象模型
在面向对象的分析和设计阶段,致力于建立模拟问题领域的对象模型。建立对象模型既包括自
底向上的抽象过程,也包括自顶向下的分解过程。
1. 自底向上的抽象
建立对象模型的第一步是从问题领域的陈述入手。分析需求的过程与对象模型的形成过程一致,开发人员与用户交谈是从用户熟悉的问题领域中的事物(具体实例)开始的,这就使用户和开发人员之间有了共同语言,使得开发人员能够彻底搞清用户需求,然后再建立正确的对象模型。开发人员需要进行以下自底向上的抽象思维。
把问题领域中的事物抽象为具有特定属性和行为的对象。
把具有相同属性和行为的对象抽象为类。
若多个类之间存在一些共性(具有相同属性和行为),把这些共性抽象到父类中。
再自底向上的抽象过程中,为了使子类能更好的继承父类的属性和行为,可能需要自顶向下的修改,从而使整个类体系更加合理。由于这类体系的构造是从具体到抽象,再从抽象到具体,符合人们的思维规律,因此能够更快,更方便的完成任务。
2. 自顶向下的分解
再建立对象模型的过程中,也包括自顶向下的分解。例如对于计算机系统,首先识别出主机对象,显示器对象,键盘对象和打印机对象等。接着对这些对象再进一步分解,例如主机对象有处理器对象,内存对象,硬盘对象和主板对象组成。系统的进一步分解因有具体的对象为依据,所以分解过程比较明确,而且也相对容易。因此面向对象建模也具有自顶向下开发方法的优点,既能有效的控制系统的复杂性,又能同时避免结构化开发方法中功能分解的困难和不确定性。
1.1.2 UML:可视化建模语言
面向对象的分析与设计方法,在20世纪80年代末至90年代中发展到一个高潮。但是,诸多流派在思想和术语上有很多不同的提法,对术语和概念的运用也各不相同,统一是继续发展的必然趋势。需要有一种统一的符号来描述在软件分析和设计阶段勾画出来的对象模型,UML(Unified Modeling Language,统一建模语言)应运而生。UML是一种定义良好,易于表达,功能强大且普遍适用的可视化建模语言。 而采用UML语言的可视化建模工具是Rational 公司开发的Rational Rose
1.2 面向对象开发中的核心思想和概念
在面向对象的软件开发过程中,开发者的主要任务就是先建立模拟问题领域的对象模型,然后通过程序代码来实现对象模型,如何用程序代码来实现对象模型,并且保证软件系统的可重用性,可扩展性和可维护性呢?本节节主要阐述面向对象开发的核心思想和概念,这些核心思想为从事面向对象的软件开发实践提供理论武器。
1.2.1 问题领域,对象,属性,状态,行为,方法,实现
问题领域是指软件系统所模拟的真实世界中的系统。随着计算机技术的发展和普及,软件系统渗透社会的各个方面,几乎可用来模拟任何一种问题领域,如学校,医院,商场,银行和太阳系等。
对象是对问题领域中事物的抽象。对象具有以下特性:
1) 万物节杰皆为对象。问题领域中的实体和概念都可以抽象为对象。例如:在学校领域,对象包括学生,成绩单,教师,课程,和教室等;在商场领域,对象包括客户,商品,订单。发票,仓库和管理员等;在用Java语言创建的图形用户界面中,窗口,滚动面板,按钮,列
表,菜单,文本框等也是对象。
2) 每个对象都是唯一的。对象的唯一性来自于真实世界中事物的唯一性。世界上不存在两片一摸一样的叶子,因此在软件系统中用来模拟两片叶子的对象也具有唯一性。
3)对象具有属性和行为。例如一部手机:牌子是诺基亚,价格是2000元,银白,能够拍照,打电话和收发短信等。这部手机的属性包括品牌类型type,价格price和颜color,行为包括拍照takePhoto(),打电话call(),发短信sendMessage()和收短信receiveMessage()
1-1 手机的UML类图
对象的行为包括具有的功能和具体的实现。在建立对象模型阶段,仅仅关注对象有什么样的功能,而不需要考虑如何实现这些功能。对象的属性用成员变量表示,对象的行为用成员方
法表示。
11是手机的UML类图。
4)对象具有状态。状态是指某个瞬间对象的各个属性的取值。对象的某些行为往往会改变对象自身的状态,即属性的取值。例如:小王的本来体重为80kg,经过减肥后,体重减到45kg,参见图1-2.
5)对象都属于某个类,每个对象都是某一个类的实例。例如:演员小红,小白和小黄,他们都属于演员类。再例如中文和英文都属于语言类。类是具有相同属性和行为的对象的集合。
同一个类的所有实例具有相同属性,表明他们的属性的含义相同,但是他们的状态不一定相
同,也就是属性取值不一定相同。例如演员小红,小白和小黄,都有姓名,性别,年龄和体重这些属性,但他们的属性值不同。
同一个类的所有实例包括类本身的所有实例及其子类的所有实例。类的所有实例具有相同的行为,意味着他们具有一些相同的功能。类本身的所有实例按同样方式实现相同功能,而子类与父类之间,以及子类之间的实例则可能采用不同的方式来实现相同的功能。
1.2.2 类,类型
类是一组具有相同属性和行为的对象的抽象。类及类的关系构成了对象模型的主要内容如图1-3所示,对象模型用来模拟问题领域,Java程序实现对象模型,Java程序运行在Java虚拟机提供的运行时环境中,Java虚拟机运行在计算机上。
计算机受存储单元的限制,只能表示和操作一些基本的数据类型,比如整数,字符和浮点数。对象模型中的类可以看作是开发人员自定义的数据类型,Java虚拟机的运行时环境封装了把自定义的数据类型映射到计算机的内置数据类型的过程,使得开发人员不受计算机的内置数据类型的限制,对任意一种问题领域,都可以方便地根据先识别对象,再进行分类(创建任意的数据类型)的思路来建立对象模型。
面向对象编程的主要任务就是定义对象模型中的各个类。例如一下是手机类的定义。
        public class CellPhone  {
          private String type;
          private String color;
          private double price;
       
          /**构造方法*/
          public CellPhone(String type,String color,double color) {
            pe=type;
            lor=color;
            this.price=price;
          }
          Public void takephoto() {……};
          Public void call() {……};
          Public void sengMessage() {……};
          Public void receiveMessage() {……};
        }
    对象模型是什么如何创建手机对象呢?Java语言采用new语句类创建对象,new语句会调用对象的构造方法。以下程序代码创建了两个手机对象,一个是诺基亚牌,银白,价格为2000元,一个是
摩托罗拉牌,蓝,价格为1999元的。
Cellphone phone1=new CellPhone (“诺基亚”,“Silvery”,2000);
Cellphone phone2=new CellPhone (“摩托罗拉”,“blue”,1999);
   
在运行时环境中,Java虚拟机首先把CellPhone类的代码加载到内存中,然后根据这个模板来创建两个CellPhone对象;所以说,对象是类的实例,类是对象的模板。
1.2.3 消息,服务
软件系统的复杂功能是由各种对象的协同工作共同完成的。例如,电视机和遥控器之间存在着这种协作关系。当用户按下遥控器的“开机”按钮后,遥控机对象对电视对象发送一个“开机”消息。电视机对象接受到这个“开机”消息后,就执行相应的操作。
每个对象都具有特定的功能,相对于其他对象而言,它的功能就是为其它对象提供服务。例如电视机具有的功能包括:开机,关机,选择频道,调节音量等。遥控器为了获得电视机的服务,需要向提出获得特定服务的请求,提出请求的过程被成为发送信息。
对象提供的服务是由对象的方法来实现的,因此发送信息也就是调用一个对象的方法。例如遥控器向电视机发送“开机”消息,意味着遥控器对象调用电视机对象的开机方法。
从使用者的角度出发,整个软件系统就是一个服务提供者。在UML语言中,系统边界被称为角。在系统的内部,每一个子系统也是服务的提供者,他们为其他子系统提供服务,子系统之间通过发送消息来相互获得服务,一个孤立的不对外提供任何服务的系统是没有任何的意义的。
对于电视机系统,看电视的观众就是它的系统边界。电视机系统是观众的服务提供者,电视机系统内的电视机对象是遥控器对象的服务提供者。图1-4显示了观众打开电视的UML时序图。                         
图1-4 观众打开电视机的UML视图
1.2.4 接口
既然每个对象都是服务的提供者,如何对外提供服务呢?对象通过接口对外提供服务。例如电视机的红外线接收器就是为遥控器提供的接口。
在现实世界中,接口也是实体,比如电源插口,洗衣机上的按钮和电灯的开关。而在面向对象范畴中,接口是一个抽象的概念,是指系统对外提供的所有服务。系统的接口描述系统能够提供哪些服务,但是不包含服务的实现细节。这里的系统既可以指整个软件系统,也可以指一个子系统。对象是最小的子系统,每个对象都是服务的提供者,因此每个对象都有接口。
手机的接口
站在使用者的角度,对象中所有向使用者公开的方法的声明构成了对象的接口。使用者调用对象的公开方法来获得服务。使用者在获得服务时,不必关心对象时如何实现服务的。