设计模式——面向对象程序设计
面向对象:
面向对象的模型是为了理解和分析目的而建立的抽象
好处:
- 省略没必要的细节
- 减少复杂度
主程序和子程序之间:
- 基于定义-使用关系的等级分解
- 直接基于编程语言的单线程控制
- 子程序通常聚合到模块中,使子程序的结构不明显
- 子程序的正确性通常取决于他调用的子程序的正确性,程序的正确性按层次推理
存在问题:
-
非必要的结构和信息的暴露:
-
全局变量可能以一种无法预料的危险的方式被使用
- 经典编程语言通常创造一些共享(例如 块结构,全局变量)
- 非定域性:使用方式依赖于实现方式
-
-
波及效应: 一处修改影响其他模块
-
对于一处的行为会关联到很多代码,很难找出被影响波及的代码
面向对象基础内容:
对象:具有属性,提供操作的实体
- 数据被量化到离散的,可区分的实体
- 两个属性完全相同的对象,也是可区分的
- 每一个对象具有唯一的对象标识符,他是可以被唯一引用的
类:对于对象的共性描述
- 具有相同数据结构和行为的对象被归为一类
- 一个抽象,描述对于应用程序重要的属性,忽略其他的属性
子类:比父类增加了其他属性
比父类的限制更多
实例:类的对象
操作:对象实行或受限于的一个行为或者变换
方法:操作的具体实现
消息:过程调用,执行方法的请求
抽象类:一个没有具体实例的类,但是他的子类有实例
抽象操作:子类必须实现的操作
面向对象高级特性:
- 封装(信息隐藏)
- 继承 (复用定义,数据和功能)
- 多态性
- 高度聚合
继承关系
- 本质上是类的精化
- 子类包含父类的所有属性
- 子类只能增加行为
- 多层具有向上的传递性
- 子类可以复用父类的方法
多态性
- 同样的操作在不同类中实现可能不同
- 多带行操作可以有多个不同的实现方法
面向对象程序的多态性表现在:自动挑选正确的方法去实现一个操作基于 1. 操作的名称 2. 正在操作的对象的类
聚合(Aggregation)
- 部分整体或者部分关系
- 一个具有多个部件的程序集对应多种聚合关系
- 聚合也可以说是一种特殊的关联
关联和聚合(Link & Aggregation)
左边聚合,右边是关联
- 聚合可以说是一种特殊的关联
- 部分-整体的关系是聚合,相互独立的关系是association
聚合和继承
-
聚合 A是B的一部分 继承 A是B的一种
-
聚合:和实例相关 继承:和类相关
-
聚合:and-relationship 继承:or-relationship
聚合的种类
- Fixed aggregate
- Variable aggregate
- Recursive aggregate 递归聚合
Fixed aggregation
子部件的数量和类型已经预定义好的
Variable aggregation
部件数量可能不同,但是数量有限
Recursive aggregation
包含一个相同类型的实例的聚合,数量是没有限制的
面向对象方法的问题
- 纯OO设计导致了拥有许多对象的大的扁平化系统,这会导致:
- 同样的老的问题会重复出现
- 成百上千的模板,难以寻找信息
- 需要一种方法去加强结构
- 大量对象需要一种额外的结构
- 结构选项:
- 层级结构 (这不一定是对象)
- 补充索引
- 分层分解:大对象和小对象
- 需要管理许多关联:
- 单一接口被限制,过于笨重
- 一些语言和系统允许多种接口
- 一个行为往往是由多个对象形成的
- 这使得整个系统很难去理解
- 交互图被用在了设计之中