软件设计师-第七章(面向对象技术)
面向对象基本概念
面向对象分析:是为了确定问题域,理解问题。
包含五个活动:认定对象
(按自然存在的实体确定对象)、组织对象
(分析对象关系,抽象成类)、对象间的互相作用
(描述各对象在应用系统中的关系)、确定对象的操作
(操作,如创建增加删除等)、定义对象的内部信息(属性)
面向对象设计:是设计分析模型和实现相应源代码,在目标代码环境中这种源代码可被执行。设计问题域的解决方案。
面向对象程序设计:用面向对象程序设计语言实现设计方案。详见案例分析。
面向对象测试:与普通测试步骤并无不同。可分为四个层次:
算法层
(测试类中定义的每个方法,类似单元测试)类层
(测试同一个类中所有方法与属性的互相作用,特有的模块测试
)模板层
(测试一组协同工作的类之间的互相作用,类似集成测试)系统层
(类似系统测试)
UML图
UML是统一建模语言,和程序设计语言并无关系。
UML三个要素:UML的基本构造快、支配这些构造块如何放置在一起的规则和运用与整个语言的一些公共机制。
UML的基本构造快包括:事务(对模型中最具有代表性的成分的抽象)、关系(把事务结合在一起)、图(聚集了相关的事务)。
UML中有四种事务:结构事务、行为事务、分组事务、注释事务。
结构事务:模型的静态部分,如类、接口、用例、构件等如下图示例:
事务
关系
- 依赖:一个事务的语义依赖于另一个事务的语义变化而变化
- 关联:是一种结构关系,描述一组链,链是对象之间的连接。分为组合(强关联)和聚合(弱关联)
- 泛化:一般/特殊的关系,子类和父类之间的关系。
- 实现:一个类元指定了另一个类元保证执行的契约。
类图
类图:静态图,为系统的静态设计视图,展现一组对象、接口、协作和他们之间的关系。
对象图
对象图:静态图,展现某一时刻一组对象及他们之间的关系,为类图的某一快照。在没有类图的前提下,对象图就是静态设计图。
用例图
用例图:静态图,展现了一组用例、参与者以及他们之间的关系。
用例图中的参与者是人、硬件或其它系统可以扮演的角色;用例是参与者完成的一系列操作。
用力之间的关系包括:
- 包含(include)
- 扩展(extend)
- 泛化
序列图
序列图:即顺序图,动态图,是场景的图形化表示,描述了以时间顺序组织的对象之间的交互活动。
有同步消息(进行阻塞调用,调用者中止执行,等待控制权返回,需要等待返回消息,用实心三角箭头表示)、
异步消息(发出消息后继续执行,不引起调用者阻塞,也不等待返回消息,由空心箭头表示)、
返回消息(由从右到左的虚线箭头表示)三种。
通信图
通信图:动态图,即协作图,是顺序图的另一种表示方法,也是由对象和消息组成的图,只不过
不强调时间顺序,只强调事件之间的通信,而且也没有固定的画法规则,和顺序图统称为交互图。
状态图
状态图:动态图,展现了一个状态机,描述单个对象在多个用例中的行为,包括单状态和组合状态。
转换可以通过事件触发器出发,事件触发后相应的监护条件会进行检查。
状态图中转换和状态是两个独立的概念,如下:图中方框代表状态,箭头上的代表触发事件,
实心圆点为起点和终点。下图描述的就是一个图书的状态变化:
活动图
活动图:动态图,是一种特殊的状态图,展现了在系统内从一个活动到另二个活动的流程。活动的分叉和汇合线是一条水平粗线。
每个分岔的分支数代表了可同时运行的线程数。
活动图中能够并行执行的是在一个分岔粗线下的分支上的活动。
UML图总结
图名称 | 用途 | 类型 |
---|---|---|
类图 | 静态图,为系统的静态设计视图,展现一组对象、接口、协作和他们之间的关系。 | 静态图 |
对象图 | 静态图,展现某一时刻一组对象及他们之间的关系,为类图的某一快照。在没有类图的前提下,对象图就是静态设计图。 | 静态图 |
用例图 | 静态图,展现了一组用例、参与者以及他们之间的关系。 | 静态图 |
序列图 | 即顺序图,动态图,是场景的图形化表示,描述了以时间顺序组织的对象之间的交互活动。 | 动态图 |
通信图 | 不强调时间顺序,只强调事件之间的通信,而且也没有固定的画法规则,和顺序图统称为交互图 | 动态图 |
状态图 | 动态图,展现了一个状态机,描述单个对象在多个用例中的行为,包括单状态和组合状态。 | 动态图 |
活动图 | 展现了在系统内从一个活动到另二个活动的流程。 | 动态图 |
设计模式
创建型设计模式
速记口诀:单抽元件厂
模式名称 | 定义 | 记忆关键字 |
---|---|---|
Singleton 单例模式 |
确保一个类仅有一个实例,并提供全局访问点 | 唯一实例 |
Abstract Factory 抽象工厂模式 |
提供一个接口来创建相关或依赖对象的家族,而不需要指定具体类 | 抽象接口 |
Prototype 原型模式 |
通过复制现有原型对象来创建新对象,避免重复初始化操作 | 原型实例化,拷贝 |
Builder 构建器模式 |
将复杂对象的构造与其表示分离,使同样的构建过程可以创建不同对象 | 类和构造分离 |
Factory Method 工厂方法模式 |
定义一个创建对象的接口,但让子类决定实例化哪个类 | 子类决定实例化 |
结构型设计模式
速记口诀:外侨组员带配饰
模式名称 | 定义 | 记忆关键字 |
---|---|---|
Facade 外观模式 |
为复杂子系统提供一个统一的高层接口,简化调用过程 | 对外统一接口 |
Bridge 桥接模式 |
将抽象部分与其实现部分分离,使它们可以独立变化 | 抽象和实现分离 |
Composite 组合模式 |
将对象组合成树形结构以表示”整体-部分”的层次关系 | 整体-部分,树形结构 |
Flyweight 享元模式 |
通过共享技术来高效地支持大量细粒度对象的重用 | 细粒度,共享 |
Proxy 代理模式 |
为其他对象提供一种代理以控制对这个对象的访问 | 代理控制 |
Adapter 适配器模式 |
将一个类的接口转换为另一个接口,使原本不兼容的类可以协同工作 | 转换,兼容接口 |
Decorator 装饰模式 |
动态地给对象添加额外的职责,相比继承更加灵活 | 附加职责 |
行为型设计模式
速记口诀:观摩对(迭)策,责令解放,戒忘台
模式名称 | 定义 | 记忆关键字 |
---|---|---|
Observer 观察者模式 |
定义对象间的一对多依赖关系,当一个对象状态改变时自动通知所有依赖对象 | 通知、自动更新 |
Template Method 模板方法模式 |
定义算法框架,允许子类在不改变结构的情况下重写特定步骤 | 子类可重写算法步骤 |
Iterator 迭代器模式 |
提供一种方法顺序访问聚合对象的元素,而不暴露其内部表示 | 顺序访问,不暴露内部 |
Strategy 策略模式 |
定义一系列算法,将每个算法封装在独立的类中,并使它们可以相互替换 | 算法替换 |
Chain of Responsibility 责任链模式 |
将请求沿着处理链传递,直到有对象处理它 | 传递请求、职责链接 |
Command 命令模式 |
将请求封装为对象,支持可撤销操作和请求队列 | 日志记录、可撤销 |
Interpreter 解释器模式 |
定义语言的文法表示,并提供解释器来处理该语法 | 解释器,虚拟机 |
Visitor 访问者模式 |
将作用于对象结构的操作与对象本身分离,便于新增操作 | 数据和操作分离 |
Mediator 中介者模式 |
定义一个中介对象来封装一组对象间的交互,降低耦合度 | 不直接引用 |
Memento 备忘录模式 |
在不破坏封装性的前提下,捕获并保存对象的内部状态以便恢复 | 保存,恢复 |
State 状态模式 |
允许对象在其内部状态改变时改变它的行为 | 状态变成类 |
面向对象设计原则
- 单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中
- 开闭原则:软件实体应当对扩展开放,对修改关闭
- 里氏替换原则:所有引用基类的地方必须能透明的使用其子类的对象
- 依赖倒转原则:高层模块不应该依赖低层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象
- 接口隔离原则:客户端不应该依赖那些它不需要的接口
- 合成复用原则:优先使用对象组合,而不是继承来达到复用的目的
- 迪米特法则:每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位