基本概念
-
对象:基本的运行实体,为类的实例,封装了数据和行为的整体(数据和行为就是属性和方法),如学生、汽车等真实存在的实体。对象具有清晰的边界、良好定义的行为和可扩展性。
- 学生有张三、李四等。张三就是具体的个体,在我们生活中能够找到的存在的个体,这个在程序里叫做对象。学生、老师都是比较广泛的概念,光说学生、老师指的是类,要具体到某个学生,例如张三就是学生这个类的一个实例,是对象。
- 将张三、李四的姓名、考号、年龄等共有的属性提取出来形成一个抽象的类。
- 一个类可以产生N个对象,对象拥有这个类的所有共有属性和方法。
-
类:是对象的抽象,定义了一组大体相似的对象结构,定义了数据和行为。包括实体类(用于对必须存储的信息和相关行为建模的类,是需要长久保存且一直存在的类)、边界类(系统内部与系统外部的业务主角之间进行交互建模的类)、控制类(用于对一个或几个用例所特有的控制行为进行建模,在用例执行过程中被动出现的特定行为的类)。在领域类模型中会涉及描述类自身情况的属性与操作,还会有描述类与类之间的关联(通过消息关联通信),但不会有对象层次的内容。
-
消息:对象之间进行通信的一种构造称为消息。
-
继承:父类和子类之间共享数据和方法的机制。是类之间的一种关系。
-
多态:不同的对象收到同一个消息时产生完全不同的反应。包括参数多态(不同类型参数多种结构类型)、包含多态(父子类型关系)、过载多态(类似于重载,一个名字不同含义)、强制多态(强制类型转换)四种类型。多态由继承机制支持。
多态就是多种形态,比如下面的draw画,可以画圆形,可以画三角形,也可以画正方形
-
覆盖(重写):子类在原有父类接口的基础上,用适合于自己要求的实现去置换父类中的相应实现。即在子类中重定义一个与父类同名同参的方法。
例如:上图父类draw了长方形,子类继承了父类的draw方法但是又想draw不一样的,draw一个圆形,那么子类可以重新定义一个方法覆盖父类方法 -
重载:与覆盖要区分开,函数重载与子类父类无关,且函数是同名不同参数。
例如下面的add方法 -
封装:一种信息隐蔽技术,其目的是使对像的使用者和生产者分离,也就是使其他开发人员无需了解所要使用的软件组件内部的工作机制,只需知道如何使用组件。
从封装本身的意思去理解,封装就好像是拿一个袋子,将数据和功能一起装进去,然后将袋子封上口子。
再比如电脑的每个单元的运行是怎么运行的,我们不知道也不需要知道,但是它对外提供了操作方法
-
静态类型是指一个对象的类型在编译时就确定;动态类型指对象类型在运行时才能确定。
-
静态绑定(静态分配)是基于静态类型的,在程序执行前方法已经被绑定:
-
动态绑定是基于动态类型的,运行时根据变量实际引用的对象类型决定调用哪个方法,动态绑定支持多态。
面向对象分析
面向对象分析:是为了确定问题域,理解问题。
五个活动
包含五个活动:认定对象(按自然存在的实体确定对像)、组织对象(分析对象关系,抽象成类)、对象间的相互作用(描述各对象在应用系统中的关系)、确定对象的操作(操作,如创建增加删除等)、定义对缘的内部信息(属性)。
例子:在线书店
假设我们正在开发一个在线书店的系统。以下是面向对象分析的五个活动如何应用于这个例子:
- 认定对象:
- 书籍(Book)
- 用户(User)
- 购物车(ShoppingCart)
- 订单(Order)
- 支付系统(PaymentSystem)
- 组织对象:
- 将对象分为几个主要的类别,如:商品(书籍)、用户、购物流程(购物车、订单)、支付流程(支付系统)。
- 确定对象之间的层次结构,例如:书籍可以是小说(Fiction)、非小说(NonFiction)等子类的父类。
- 描述对象间的相互作用:
- 用户可以添加书籍到购物车(User -> ShoppingCart)
- 用户可以从购物车中移除书籍(User -> ShoppingCart)
- 用户可以提交订单(User -> Order)
- 订单会通过支付系统处理支付(Order -> PaymentSystem)
- 确定对象的操作:
- 用户对象可以执行登录、注册、搜索书籍、添加书籍到购物车等操作。
- 书籍对象可以提供信息,如作者、出版日期、价格等。
- 购物车对象可以添加书籍、移除书籍、计算总价等。
- 定义对象的内部信息:
- 书籍对象包含的信息有:书名、作者、ISBN、价格等。
- 用户对象包含的信息有:用户名、密码、邮箱、地址等。
- 订单对象包含的信息有:订单号、用户信息、订单日期、订单状态等。
面向对象设计和测试
面向对象设计:是设计分析模型和实现相应源代码,在目标代码环境中这种源代码可被执行。设计问题域的解决方案。需要用到UML图
面向对象程序设计:用面向对象程序设计语言实现设计方案。详见下午软件设计。
面向对象测试:与普通测试步骤并无不同。可分为四个层次:算法层(测试类中定义的每个方法,类似单元测试)、类层(测试同一个类中所有方法与属性的相互作用,特有的模块测试)、模板层(测试一组协同工作的类之间的相互作用,类似集成测试)、系统层(类似系统测试)。
面向对象的设计原则
- 单一责任原则:
这个原则就是让一个类只做一件事情,不要把太多的任务放在一个类里。这样做的好处是,当你需要修改某个功能时,只需要关注一个类,而不用担心影响其他功能。- 举例:想象你正在开发一个学生管理系统。你有一个Student类,它负责存储学生的信息,比如姓名和年龄。你还有一个StudentManager类,它负责管理学生的添加、删除等操作。这样,每个类只负责一个特定的责任。
- 举例:想象你是一名学生。你每天要面对多门课程,每门课程都有不同的老师和作业。如果你把所有课程的笔记、作业和书都放在一个文件夹里,当你需要找到特定课程的资料时会变得非常混乱。相反,如果你为每门课程都准备一个专用的文件夹,你就能更轻松地管理和找到所需的信息。每个文件夹就代表了一个类,它们只负责一个特定的任务,即存储与该课程相关的资料。
- 开放封闭原则:
这个原则意味着你可以扩展现有的代码,但不需要修改已有的代码。你应该允许新功能的添加,而不会影响到已经运行良好的功能。对添加开放,对修改封闭- 举例:假设你正在编写一个图形绘制软件,你有一个Shpe类,代表各种形状。现在,你想添加一个新的形状,比如三角形。你应该能够通过创建一个新的类(例如Triangle类),而不是修改已有的Shape类。
- 举例:想象你是一名家庭主妇,你正在准备一顿丰盛的晚餐。你已经在规划中有一些菜肴,但客人可能会有特殊的饮食要求。你可以轻松地劬加入一个新的菜肴或调整配方,而不会影响到你已经准备好的菜肴。这就是开放封闭原则,你的晚餐计划是“封闭”的,因为已经准备好了,但你可以“开放”地添加新的菜肴,以满足不同的需求。
- 里氏替换原则:
这个原则强调子类应该能够替换父类而不会影响程序的正确性。换句话说,你应该能韵够使用子类的实例来替代父类的实例,而不引发错误。- 举例:想象你有一个Bid类,代表鸟类,其中有一个y方法。现在你派生了一个企鹅类。根据里氏替换原则,你应该能够在不引发错误的情况下使用企鹅对象来调用y方法,即使实际上企鹅不会飞。
- 举例:想象你在一个家庭聚会上,有一个传统的糕点摊位。人们习惯了在那里购买各种类型的糕点。假设你去那里买了一个巧克力蛋糕,但是当你尝试吃它时,却发现它其实是一个水果蛋糕。这就违反了里氏替换原则,因为人们期望能够用巧克力蛋糕替代任何其他类型的蛋糕。但在这个例子中,水果蛋糕并不能真正替代巧克力蛋糕,因为它不是巧克力蛋糕的子类。
- 依赖倒置原则:
这个原则强调抽象应该依赖于细节,而不是相反。高层模块不应该直接依赖于低层模块的细节,而应该通过抽象进行交互。我们在调用功能的时候尽量通过接口调用- 举例:假设你正在开发一个电子商务平台。你有一个OrderProcessor类负责处理订单。而这个类不应该直接依赖于具体的支付方式,而是依赖于一个抽象的PaymentGateway接口。这样,你可以轻松地更改支付方式,而不必修改
OrderProcessor。 - 举例:想象你是一名旅行者,你需要租一辆车去探索一个城市。你不需要亲自去了解车子的每个零件如何工作,你只需要知道如何使用它们。租车公司为你提供了一辆可用的车,而不是让你去修理引擎或更换轮胎。在这个例子中,你是高层模块,租车公司是低层模块,你依赖于租车公司提供的抽象服务,而不是直接与车辆细节打交道。
- 举例:假设你正在开发一个电子商务平台。你有一个OrderProcessor类负责处理订单。而这个类不应该直接依赖于具体的支付方式,而是依赖于一个抽象的PaymentGateway接口。这样,你可以轻松地更改支付方式,而不必修改
- 接口分离原则:
这个原则强调客户端不应该被强制依赖它们不需要的方法。接口应该只包含客户端需要的方法,避免造成冗余和不必要的复杂性。- 举例:想象你正在设计一个媒体播放器。你应该根据功能拆分成不同的接口,如AudioPlayer和VideoPlayer。这样,如果你只需要一个音频播放器,你就不会被迫实现视频播放相关的方法,从而遵循了接口分离原则。
- 举例:假设你正在考虑加入一个运动俱乐部。你有多个选项可供选择,如游泳、篮球和瑜伽。不同的人有不同的兴趣,你可能只想参加其中一种活动。运动俱乐部应该将这些活动分开成不同的项目,以便每个人只关注他们感兴趣的部分。这样,你不需要强制自己参加所有的活动,而是可以选择与你有兴趣的活动接口。
练习题
【2021】Java语言符合的特征有()和自动的垃圾回收处理
①采用即时编译
②采用静态优化编译
③对象在堆空间分配
④对象在栈空间分配
(A)①③
(B)①④
©②③
(D)②④
答案A
【2021】面向对象分析时,执行的活动顺序通常是
()
(A)认定对象、组织对象、描述对象的相互作用、确定对象的操作
(B)认定对象、定义属性、组织对象、确定对像的操作
©认定对象、描述对象间的相互作用、确定对象的操作、识别包
(D)识别类及对象、识别关系、定义属性、确定对象的操作
答案A
【2013】38-39.在面向对象技术中,38说明一个对象具有多种形态,_39定义超类与子类之间的关系。
(38)
A.继承 B.组合 C.封装 D.多态
(39)
A.继承 B.组合 C.封装 D.多态
答案D A
【2015】面向对象(0选择合适的面向对象程序设计语言,将程序组织为相互协作的对象集合,每个对象表示某个类的实例,类通过继承等关系进行组织。
A.分析
B.设计
C.程序设计
D.测试
答案C
【2015】在面向对象的系统中,对象是运行时实体,其组成部分不包括37);一个类定义了一组大体相似的对象,这些对象共享(38)。
(37)
A.消息 B.行为(操作) C.对象名 D.状态
(38)
A.属性和状态 B.对象名和状态 C.行为和多重度 D.属性和行为
答案A D
不一定有消息,只有对象与对象通信的时候才会有
参考
深入解析面向对象分析的五大活动