nbhkdz.com冰点文库

2.设计模式引言

时间:2018-01-15


软件设计与体系结构
合肥工业大学 软件学院 主讲:徐本柱 Mail:bzxu@hfut.edu.cn

1

第一章 设计模式——引言
前车之辙,后车可鉴

2

设计模式的目的
?面临的软件设计问题 ? 新手(菜鸟)
面对众多选择无从下手 ? 求助于以前使用过的非面向对象技术 ? 花费较长时间领会良好的面向对象设计
?

? 老手(老鸟)
?

有经验的面向对象设计者的确能做出良好的设计

?老手显然知道一些新手所不知道的东西
3

1.1 什么是设计模式
? 广义——软件设计模式是可解决一类软件问题并能重

复使用的软件设计方案 ? 狭义——设计模式是对被用来在特定场景下解决一般 设计问题的类和相互通信的对象的描述
?

是在类和对象的层次描述的可重复使用的软件设计问题的解 决方案

? 模式体现的是程序整体的构思,也会出现在分析或者

是概要设计阶段
? ?

? 模式的核心思想
增加抽象层 分离出变化部分(从不变部分中)
4

模式的基本要素
? 模式名称(Pattern Name):助记名,较高抽象层次设计 ? 问题(Problem):描述应该在何时使用模式。解释了设

计问题和问题存在的前因后果,可能还描述模式必须满 足的先决条件 ? 解决方案(Solution):描述了设计的组成成分、相互关 系及各自的职责和协作方式。模式就像一个模板,可 应用于多种场合,所以解决方案并不描述一个具体的 设计或实现,而是提供设计问题的抽象描述和解决问 题所采用的元素组合(类和对象) ? 效果(consequences ):描述模式的应用效果及使用模式 应权衡的问题
5

1.2 MVC中的设计模式
?MVC
? 一种软件体系结构 ? 近年来广泛应用于各种Web框架中

6

MVC的组成部分
?模型(Model)
? 应用对象

?视图(View)
? 应用对象在屏幕上的显示对象 ? 可以为一个模型提供不同的视图对象

?控制器(Controller)
? 对用户输入的响应方式 ? 可以为一个视图提供不同的响应对象
7

1) MVC中的Observer 模式
Relative Percentages

A B C D X 15 35 35 15 D

A

Y
Z

10 40 30 20
10 40 30 20 A B C D

B
C

Change notification Requests, modifications

A=10% B=40% C=30% D=20%

Application data

2) MVC中的Composite模式
?嵌套视图——组合视图
? 一个组合视图可用于任何视图可用的地方,

但是它包含并管理嵌套于其中的视图 ? View类的子类—CompositeView类来支持 ? CompositeView对象行为上类似于View对象
?这个设计被描述为Composite (4.3)模式

3 MVC中的Strategy模式
?View-Controller之间的关系
? 将响应机制封装在Controller中,存在一个

Controller类层次结构。 ? View使用Controller子类的实例来实现一个 特定的响应策略。 ? 要实现不同响应策略,只要用不同种类的 Controller实例替换即可。

1.3 描述设计模式
? 固定模板(13部分) ? 1 模式名和分类
?

AbstractFactory(抽象工厂)——对象创建型模式
设计模式是做什么的?它的基本原理和意图是什么?它解 决的是什么样的特定设计问题?

?

2 意图
?

?
?

3 别名 4 动机
?

说明一个设计问题以及如何用模式中的类、对象来解决该 问题的特定情景

1.3 描述设计模式(续1)
?固定模板(13部分)
?5

适用性
什么情况下可以使用该设计模式?该模式可用来 改进哪些不良设计?如何识别这些情况? 使用类图来描述模式中的类或对象之间的联系
模式中的类或对象及其各自职责 参与者如何协作以实现其职责

?

?6 ?7

结构(参考) 参与者

?

?

?8

协作

?

1.3 描述设计模式(续2)
? 固定模板(13部分) ? 9 效果
?

使用模式后的优点 实现时应注意的事项 用C++或SmallTalk实现该模式的代码片断 实际系统中发现的该模式的例子 与该模式紧密相关的其它模式?如何配合使用?

? ? ? ?

10 实现
?

11 代码示例
?

12 已知应用
?

13 相关模式
?

1.4 设计模式的编目
?23种模式

1.5 设计模式的分类
?按目的分类
? 创建型:与对象的产生相关 ? 结构型:处理类或对象的组合 ? 行为型:对象之间如何交互,怎样分配职责。

?按范围分类
? 类模式:处理类之间的关系
? 对象模式:处理对象之间的联系

1.5 设计模式的分类
? 结合上述两种标准,将设计模式划分为6类: ? 创建型类模式
?

将对象的创建工作延迟到子类

? ? ? ? ?

创建型对象模式
?

将对象的创建工作延迟到另一个对象中
使用继承机制组合类

结构型类模式
?

结构型对象模式
?

描述了对象的组装方式
使用继承描述算法或控制流 对象之间如何协作来完成单个对象无法完成的任务

行为型类模式
?

行为型对象模式
?

设计模式空间

设计模式之间的关系

1.6 设计模式怎样解决设计问题
?1.6.1 寻找合适的对象 ? OOA
?

通过用例描述寻找领域对象

?

OOD
OOD最困难的部分是将系统分解成对象集合 ? 通过用例设计发现抽象对象 ? 所谓抽象,是指与领域对象比较而言,如算法类 ? 设计模式帮你确定并不明显的抽象和描述这些抽 象的对象
?

1.6 设计模式如何解决设计问题
?1.6.2决定对象的粒度
? ?

许多模式涉及到对象的分解问题 怎样决定一个对象应该是什么 Facade描述了怎样用对象表示完整的子系统 Flyweight描述了如何支持大量的最小粒度的对象 …

?设计模式很好地讲述了这个问题
? ?

?

1.6 设计模式如何解决设计问题
?1.6.3 指定对象的接口
? ?

?
?

?

类型是用来标示特定接口的一个名字 对象是封闭的,只有通过接口才能与外界交流 动态绑定:运行时刻才受你的具体的实现的约束 设计模式通过确定接口的主要组成部分来帮助定义 接口 设计模式也指定了接口之间的关系

1.6 设计模式如何解决设计问题
?1.6.4 描述对象的实现
? 类继承与接口继承的比较
?

类(class)与类型(type)
? ?

类定义了对象的实现——具体类 类型用来标示接口——接口或抽象类

? 针对接口编程,而不是针对实现编程(R1)
?

客户类不用知道他们使用的对象是何种具体类, 只需知道是何种类型,降低了相互间的耦合度 遵从抽象类定义的接口,设计模式中的常用办法。

? 不将变量声明为某个具体类的实例对象
?

1.6 设计模式如何解决设计问题
?1.6.5 运用复用机制 ? 继承和组合的比较
继承——白箱复用 ? 组合——黑箱复用
?
?

允许你在运行时刻改变被组合的行为

?

优先使用对象组合,而不是继承(R2)

? 委托(代理)
?

对象组合的特例
模板类:允许在定义一个类型时并不指定该类型所 用到的其它类型。
?

? 继承和参数化类型的比较
?

允许你改变类所用到的类型

1.6 设计模式如何解决设计问题
?1.6.6 运行时刻和编译时刻的结构
? 运行时刻和编译时刻的结构
?

差别很大
?
?

编译时刻:继承关系固定的类组成 运行时刻:由快速变化的对象网络组成

? 聚合和关联的比较

表示区别 ? 实现方法相同 ? 聚合还是相识是由意图而不是语言机制决定
?

1.6 设计模式如何解决设计问题
?1.6.7 设计应支持变化 ? 导致重新设计的常见原因
显式地创建一个对象; ? 对特殊操作的依赖; ? 对硬件和软件平台的依赖; ? 对对象表示或实现的依赖; ? 算法依赖; ? 紧耦合 ? 通过生成子类来扩充功能; ? 不能方便地对类进行修改。
?

1.6 设计模式如何解决设计问题
?1.6.7 设计应支持变化
? 设计模式在开发3类主要应用中的作用
?

应用程序
?
? ?

优先考虑内部复用性、可维护性和可扩充性 设计模式通过减少依赖性来提高内部复用性。 通过显示怎样扩展类层次结构和使用对象复合,增强 可扩充性。

1.6 设计模式如何解决设计问题
?1.6.7 设计应支持变化
? 设计模式在开发3类主要应用中的作用
?

工具箱
?
?

是一组相关的、可复用的类的集合,提供通用的功能。 避免假设和依赖。

1.6 设计模式如何解决设计问题
?1.6.7 设计应支持变化
? 设计模式在开发3类主要应用中的作用
?

框架
?
?

规定了应用的体系结构。 松散耦合更重要。

1.6 设计模式如何解决设计问题
?1.6.7 设计应支持变化
? 设计模式和框架的区别

设计模式比框架更抽象 ? 设计模式是比框架更小的体系结构元素 ? 框架比设计模式更加特例化
?

1.7 怎样选择设计模式
?考虑设计模式是怎样解决设计问题的 ?阅读模式的意图部分

?研究模式如何关联
?研究目的相似的模式 ?检查重新设计的原因 ?考虑你的设计中哪些是可变的
? 表1-2

1.8 怎样使用设计模式
?理解记忆 ?在软件开发中使用

设计模式的使用限制
?通过引入额外的间接层次获得灵活性和

可变性的同时,使设计更复杂,降低运 行性能。 ?只有当模式提供的灵活性是真正需要时, 才有必要使用。


赞助商链接