软件工程面向对象的设计模式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果一个目标有多个观察者,那么目标也依赖 所有观察者,从而目标对象无法独立复用。
如何消除目标和观察者之间的互相依赖呢?
意图
定义对象间一对多的依赖关系,当一个对象 的状态发生改变时,所有依赖于它的对象都 得到通知并自动更新
别名
发布—订阅 (Publish-Subscribe)
面向对象的设计模式
北京化工大学计算机系 袁国栋
1. 什么是设计模式? 2. 设计模式的描述和分类 3. 设计模式如何解决设计问题 4. 几种常用的设计模式
1. 什么是设计模式?
美国C.亚历山大
每一个模式描述了一个在我们周围不断重复发生的 问题,以及该问题的解决方案的核心。这样,你就 能一次又一次地使用该方案而不必做重复劳动
Aggregate
聚合定义创建响应Iterator对象的接口
ConcreteAggregate
具体聚合实现响应的接口
4.3 observer模式
一个对象依赖于另一个对象,必须根据后者的 状态更新自己的状态
前者--观察者对象,后者--目标对象
不但观察者依赖于目标,当目标的状态改变时 也要通知观察者,这就出现了双向的依赖。两 个对象互相依赖的后果是它们必须一起复用。
当对一个对象的改变需要同时改变其它对 象,而不知道具体有多少对象需要改变时
当一个对象必须通知其它对象,而它又不能 假定其它对象是谁。---解决紧耦合
实现
一个观察者可以观察多个目标 Notify不总是由目标对象调用,可以由一
个观察者或其它对象调用。
兴趣小组
对于兴趣小组来说,注册用户就是观察者,而兴趣小 组本身是目标。
兴趣小组必须提供注册的机制,这样兴趣小组才能知 道用户的邮件地址,可以维护一个订户的邮件列表, 能在信息更新时向订户发送变更通知。
同时兴趣小组必须提供注销的机制,当用户对目标不 感兴趣时,可以取消订阅。(注销机制是非常必要的, 因为IE兴趣小组是一个名副其实的邮箱轰炸者)
使用注册和注销机制可以动态增加或删除观察者。
ConcreteObserver(具体观察者)
维护一个指向ConcreteSubject对象的引用 存储有关状态,这些状态应与目标的状态保持一致 实现Observer的更新接口以使自身状态与目标的状态保持一致
协作—交互图
适用性
当一个抽象模型有两个方面,其中一个方面 依赖于另一个方面。将这两者封装在独立的 对象中以使它们可以各自独立地改变和复用
当这个唯一实例应该是通过子类化可扩展的,并且 客户应该无需更改代码就能使用一个扩展的实例 时。
结构
参与者
Singleton
实现
保证一个唯一的实例 考虑使用静态成员函数+ lazy initialize 使用global/static 对象时可能存在的问题
创建Singleton类的子类
实例
结构
参与者
Subject(目标)
目标知道它的观察者。一个目标可以有多个观察者 提供注册和删除观察对象的接口
Observer(观察者)
为目标改变时需要获得通知的对象定义一个更新接口
ConcreteSubject(具体目标)
将有关状态存入各ConcreteObserver对象 当其状态改变时,向各个观察者发出通知
效果(consequences)
描述了模式应用的效果及使用模式应权衡的问题
2. 设计模式的描述和分类
描述设计模式
模式名和别名 意图
设计模式是做什么的?基本原理和意图是什么? 它解决的是什么样的特定设计问题
动机 适用性 结构
采用基于对象建模技术(OMT)对模式中的类进行图形描述
面向对象程序设计的经验总结
1. 什么是设计模式?(cont.)
设计模式四要素
模式名称(pattern name)
助记名,用一两个词来描述模式的问题、解决方案和效果
问题(problem)
应该在何时使用模式
解决方案(solution)
描述了设计的组成成分,各组成成分间的相互关系及各自 的职责和协作方式—(模板、抽象意义)
适用性
访问一个聚合对象的内容而无需暴露它的内 部表示
支持聚合对象的多种遍历 为遍历不同的聚合结构提供一个统一的接口
结构
参与者
Iterator
Iterator定义访问和遍历元素的接口
ConcreteIterator
具体Iterator实现Iterator接口 对该聚合遍历时跟踪当前位置
ListIterator
#wenku.baidu.comndex
+First() +Next() +IsDone() +CurrentItem()
关键思想
将列表的访问和遍历从列表对象中分离出来 并放入一个Iterator(迭代器)
Iterator类定义了访问该列表元素的接口 Iterator对象负责跟踪当前的元素
参与者 相关模式
2. 设计模式描述和分类(cont.)
根据目的不同,模式分为三类创建型、结 构型和行为型
3. 设计模式如何解决设计问题
寻找合适的对象 决定对象的粒度
对象的大小和数目
指定对象接口
该对象所能接受的全部请求的集合 确定接口的主要组成部分 经接口发送的数据类型 接口中不应包括的内容
减少了观察者之间的偶合,每个观察者只需要知道目 标就可以了,无须关心其它观察者。
不使用观察者模式和使用观察者模式
描述对象的实现,etc.
4. 几种设计模式
Singleton模式 Iterator模式 observer模式
4.1 Singleton模式
意图
保证一个类仅有一个实例,并提供一个访问它的全 局访问点
动机
对于某些类而言,整个系统中必须只有一个实例
适用性
当类只能有一个实例而且客户可以从一个众所周知 的访问点访问它时
4.2 Iterator模式
意图
提供一种方法顺序访问一个聚合对象中的各个元 素,而又需暴露该对象的内部表示
别名
游标 cursor
动机
聚合对象在不暴露内部结构的前提下,能被访问它 的元素、遍历等操作(List)
不希望类的接口列表中出现大量的遍历操作
List
+Count() +Append(in Element) +Remove(in Element)
如何消除目标和观察者之间的互相依赖呢?
意图
定义对象间一对多的依赖关系,当一个对象 的状态发生改变时,所有依赖于它的对象都 得到通知并自动更新
别名
发布—订阅 (Publish-Subscribe)
面向对象的设计模式
北京化工大学计算机系 袁国栋
1. 什么是设计模式? 2. 设计模式的描述和分类 3. 设计模式如何解决设计问题 4. 几种常用的设计模式
1. 什么是设计模式?
美国C.亚历山大
每一个模式描述了一个在我们周围不断重复发生的 问题,以及该问题的解决方案的核心。这样,你就 能一次又一次地使用该方案而不必做重复劳动
Aggregate
聚合定义创建响应Iterator对象的接口
ConcreteAggregate
具体聚合实现响应的接口
4.3 observer模式
一个对象依赖于另一个对象,必须根据后者的 状态更新自己的状态
前者--观察者对象,后者--目标对象
不但观察者依赖于目标,当目标的状态改变时 也要通知观察者,这就出现了双向的依赖。两 个对象互相依赖的后果是它们必须一起复用。
当对一个对象的改变需要同时改变其它对 象,而不知道具体有多少对象需要改变时
当一个对象必须通知其它对象,而它又不能 假定其它对象是谁。---解决紧耦合
实现
一个观察者可以观察多个目标 Notify不总是由目标对象调用,可以由一
个观察者或其它对象调用。
兴趣小组
对于兴趣小组来说,注册用户就是观察者,而兴趣小 组本身是目标。
兴趣小组必须提供注册的机制,这样兴趣小组才能知 道用户的邮件地址,可以维护一个订户的邮件列表, 能在信息更新时向订户发送变更通知。
同时兴趣小组必须提供注销的机制,当用户对目标不 感兴趣时,可以取消订阅。(注销机制是非常必要的, 因为IE兴趣小组是一个名副其实的邮箱轰炸者)
使用注册和注销机制可以动态增加或删除观察者。
ConcreteObserver(具体观察者)
维护一个指向ConcreteSubject对象的引用 存储有关状态,这些状态应与目标的状态保持一致 实现Observer的更新接口以使自身状态与目标的状态保持一致
协作—交互图
适用性
当一个抽象模型有两个方面,其中一个方面 依赖于另一个方面。将这两者封装在独立的 对象中以使它们可以各自独立地改变和复用
当这个唯一实例应该是通过子类化可扩展的,并且 客户应该无需更改代码就能使用一个扩展的实例 时。
结构
参与者
Singleton
实现
保证一个唯一的实例 考虑使用静态成员函数+ lazy initialize 使用global/static 对象时可能存在的问题
创建Singleton类的子类
实例
结构
参与者
Subject(目标)
目标知道它的观察者。一个目标可以有多个观察者 提供注册和删除观察对象的接口
Observer(观察者)
为目标改变时需要获得通知的对象定义一个更新接口
ConcreteSubject(具体目标)
将有关状态存入各ConcreteObserver对象 当其状态改变时,向各个观察者发出通知
效果(consequences)
描述了模式应用的效果及使用模式应权衡的问题
2. 设计模式的描述和分类
描述设计模式
模式名和别名 意图
设计模式是做什么的?基本原理和意图是什么? 它解决的是什么样的特定设计问题
动机 适用性 结构
采用基于对象建模技术(OMT)对模式中的类进行图形描述
面向对象程序设计的经验总结
1. 什么是设计模式?(cont.)
设计模式四要素
模式名称(pattern name)
助记名,用一两个词来描述模式的问题、解决方案和效果
问题(problem)
应该在何时使用模式
解决方案(solution)
描述了设计的组成成分,各组成成分间的相互关系及各自 的职责和协作方式—(模板、抽象意义)
适用性
访问一个聚合对象的内容而无需暴露它的内 部表示
支持聚合对象的多种遍历 为遍历不同的聚合结构提供一个统一的接口
结构
参与者
Iterator
Iterator定义访问和遍历元素的接口
ConcreteIterator
具体Iterator实现Iterator接口 对该聚合遍历时跟踪当前位置
ListIterator
#wenku.baidu.comndex
+First() +Next() +IsDone() +CurrentItem()
关键思想
将列表的访问和遍历从列表对象中分离出来 并放入一个Iterator(迭代器)
Iterator类定义了访问该列表元素的接口 Iterator对象负责跟踪当前的元素
参与者 相关模式
2. 设计模式描述和分类(cont.)
根据目的不同,模式分为三类创建型、结 构型和行为型
3. 设计模式如何解决设计问题
寻找合适的对象 决定对象的粒度
对象的大小和数目
指定对象接口
该对象所能接受的全部请求的集合 确定接口的主要组成部分 经接口发送的数据类型 接口中不应包括的内容
减少了观察者之间的偶合,每个观察者只需要知道目 标就可以了,无须关心其它观察者。
不使用观察者模式和使用观察者模式
描述对象的实现,etc.
4. 几种设计模式
Singleton模式 Iterator模式 observer模式
4.1 Singleton模式
意图
保证一个类仅有一个实例,并提供一个访问它的全 局访问点
动机
对于某些类而言,整个系统中必须只有一个实例
适用性
当类只能有一个实例而且客户可以从一个众所周知 的访问点访问它时
4.2 Iterator模式
意图
提供一种方法顺序访问一个聚合对象中的各个元 素,而又需暴露该对象的内部表示
别名
游标 cursor
动机
聚合对象在不暴露内部结构的前提下,能被访问它 的元素、遍历等操作(List)
不希望类的接口列表中出现大量的遍历操作
List
+Count() +Append(in Element) +Remove(in Element)