工学4java面向对象设计课件_第1页
工学4java面向对象设计课件_第2页
工学4java面向对象设计课件_第3页
工学4java面向对象设计课件_第4页
工学4java面向对象设计课件_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java面向对象设计思想计算机学院通信软件工程中心张艳梅 1第1页,共21页。本章主要内容:1、一切皆对象一切皆对象。程序由对象构成。对象由更小的对象构成。每个对象有其职责。对象职责通过它的下属对象的职责实现和下属对象互相协作来实现。2、从实例体会OOP开始使用对象继承的好处接口可是个利器2第2页,共21页。1、一切皆对象对象:是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划和事件。对象具有状态,一个对象用数值来描述它的状态。对象具体操作,用来改变对象的状态,操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封闭于

2、对象的统一体中。3第3页,共21页。1.1 一切皆对象理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。 当我们进行面向对象的程序设计时,面临的最大一项挑战性就是,如何把问题描述转化为对象架构。 4第4页,共21页。1.2 程序由对象构成程序是一大堆对象的组合。例:Light lt = new Light();通过消息传递,各对象知道自己该做些什么。例:lt.on();lt.off();lt.brighten();lt.dim();为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函

3、数。 使用一些预先定义好的类时,我们在程序里采用的代码是非常简单和直观的。 5第5页,共21页。1.3 对象由更小的对象构成(1)许多人认为代码重用是面向对象程序设计提供的最伟大的一种杠杆。为重复使用一个类,最简单的办法是直接使用那个类的对象。但同时也能将那个类的一个对象置入一个新类。我们把这叫作“创建一个成员对象”。新类可由任意数量和类的其他对象构成。这个概念叫作“组合”(也叫“包含”)在现有类的基础上组织一个新类。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。6第6页,共21页。1.3 对象由更小的对象构成(2)对象的组合具有极大的灵活性。新类的“成员对象”通常设为“私

4、有”(Private),这样我们可在不干扰客户代码的前提下,从容地修改那些成员。也可以在“运行期”更改成员,这进一步增大了灵活性。由于继承的重要性,所以在面向对象的程序设计中,它经常被重点强调。作为新加入这一领域的程序员,或许早已先入为主地认为“继承应当随处可见”。沿这种思路产生的设计将是非常笨拙的,会大大增加程序的复杂程度。相反,新建类的时候,首先应考虑“组合”对象;这样做显得更加简单和灵活。利用对象的组织,我们的设计可保持清爽。7第7页,共21页。1.4 每个对象都有其职责(1)“接口”(Interface)规定了可对一个特定的对象发出哪些请求。然而,必须在某个地方存在着一些代码,以便满足

5、这些请求。这些代码与那些隐藏起来的数据便叫作“隐藏的实现”。对象的职责就是决定如何对这条消息作出反应(执行相应的代码)。每个对象都有一种模版。类:具体相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化是对象,也可说实例是对象。类具体属性和操作。8第8页,共21页。1.4 每个对象都有其职责(2)一个类最重要的特征就是“能将什么消息发给它?”。 Java 采用三个显式关键字以及一个隐式关键字来设置类边界:public,private,protected 以及暗示性的friendly。若未明确指定其他关键字,则默认为后者。这些关键字的使用和含义都是相当直观的,它们决定了谁能使用后续

6、的定义内容。 9第9页,共21页。1.5 对象职责由下属对象协作实现(1)我们费尽心思做出一种类后,假如不得不又新建一种类,令其实现大致相同的功能,那会是一件非常令人灰心的事情。但若能利用现成的类,对其进行“克隆”,再根据情况进行添加和修改,情况就显得理想多了。“继承”正是针对这个目标而设计的。但继承并不完全等价于克隆。 10第10页,共21页。1.5 对象职责由下属对象协作实现(2)有两种做法可将新得的衍生类与原来的基础类区分开。第一种做法:为衍生类添加新函数(功能)。一般都是意识到基础类不能满足我们的要求。新类“类似”原类第二个办法是改变基础类一个现有函数的行为。我们将其称作“改善”那个函

7、数。只需为衍生类的函数建立一个新定义即可。我们的目标是:“尽管使用的函数接口未变,但它的新版本具有不同的表现”。新类“等价”原类11第11页,共21页。1.5 对象职责由下属对象协作实现(3)由于类为“圆”(Circle)的一个对象也属于类为“形状”(Shape)的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP 最重要的概念之一。 若通过继承增添了一种新类,如“三角形”,那么我们为“形状”编写的代码不用改变。所以说程序具备了“扩展能力” 。 12第12页,共21页

8、。2、从实例理解面向对象设计思想假定我们要设计一个媒体播放器。该媒体播放器目前只支持音频文件mp3和wav。初步设计出来的播放器可能很简单: public class MediaPlayer private void playMp3() System.out.println(Play the mp3 file.); private void playWav() System.out.println(Play the wav file.); public void play(string audioType) switch (audioType.ToLower() case (mp3): pla

9、yMp3(); break; case (wav): playWav(); break; 13第13页,共21页。2、需求变更促使我们改善自然,你会发现这个设计非常的糟糕。因为它根本没有为未来的需求变更提供最起码的扩展。当你为应接不暇的需求变更而焦头烂额的时候,你可能更希望让这份设计到它应该去的地方,就是桌面的回收站。 仔细分析这段代码,它其实是一种最古老的面向结构的设计。如果你要播放的不仅仅是mp3和wav,你会不断地增加相应地播放方法,然后让switch子句越来越长,直至达到你视线看不到的地步。好吧,我们先来体验对象的精神。根据OOP的思想,我们应该把mp3和wav看作是一个独立的对象。那

10、么是这样吗?14第14页,共21页。2、建立对象,统一接口public class MP3 public void play() System.out.println(Play the mp3 file.); public class WAV public void play()System.out.println(Play the wav file.); 你已经知道怎么建立对象了。更可喜的是,你在不知不觉中应用了重构的方法,把原来那个垃圾设计中的方法名字改为了统一的play()方法。但似乎你并没有击中要害,以现在的方式去更改MediaPlayer的代码,实质并没有多大的变化。15第15页,共

11、21页。2、引入继承,为了?既然mp3和wav都属于音频文件,他们都具有音频文件的共性,为什么不为它们建立一个共同的父类呢? public class AudioMedia public void play() System.out.println(Play the AudioMedia file.); 现在我们引入了继承的思想,OOP也算是象模象样了。得意之余,再认真分析下,其实在现实生活中,我们播放的只会是某种具体类型的音频文件,因此这个AudioMedia类并没有实际使用的情况。对应在设计中,就是:这个类永远不会被实例化。所以,还得动一下手术,将其改为抽象类。16第16页,共21页。2、

12、出现类层次(继承+组合)好了,现在的代码有点OOP的感觉了: public abstract class AudioMedia public abstract void play(); public class MP3 extends AudioMedia public void Play() System.out.println(Play the mp3 file.); public class WAV extends AudioMedia public void Play() System.out.println(Play the wav file.); public class Medi

13、aPlayer public void play(AudioMedia media) media.play(); 17第17页,共21页。2、无止境的发展看看现在的设计,保证了类的最小化原则,更利于扩展(到这里,你会发现play方法名改得多有必要)。 即使你现在又增加了对WMA文件的播放,只需要设计WMA类,并继承AudioMedia,重写play方法就可以了,MediaPlayer类对象的play方法根本不用改变。是不是到此就该画上圆满的句号呢?然后刁钻的客户是永远不会满足的,他们希望你的媒体播放器能够支持视频文件。你又该痛苦了,因为视频文件和音频文件有很多不同的地方,你可不能偷懒,让视频文

14、件对象认音频文件作父亲啊。你需要为视频文件设计另外的类对象了,假设我们支持RM和MPEG格式的视频:18第18页,共21页。2、追加一个继承层次public abstract class VideoMedia public abstract void Play(); public class RM extends VideoMedia public void Play() System.out.println(Play the rm file.); public class MPEG extends VideoMedia public void Play() System.out.printl

15、n(Play the mpeg file.); 糟糕的是,你不能一劳永逸地享受原有的MediaPlayer类了。因为你要播放的RM文件并不是AudioMedia的子类。19第19页,共21页。2、接口可是个利器不过不用着急,因为接口这个利器你还没有用上。虽然视频和音频格式不同,别忘了,他们都是媒体中的一种,很多时候,他们有许多相似的功能,比如播放。根据接口的定义,你完全可以将相同功能的一系列对象实现同一个接口:public interface IMedia abstract void play(); public abstract class AudioMedia implements IMedia public abstract void play(); public abstract class VideoMedia implements IMedia public abstract void play(); 再更改一下MediaPlayer的设计就OK了: public class MediaPlayer public void play(IMedia media) media.play(); 20第20页,共21页。2、总结,思考从MediaPlayer类的演变,我们可以得出这样一个结论:在调用类对象的属性和方法时,尽量避免将具

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论