资源预览内容
第1页 / 共88页
第2页 / 共88页
第3页 / 共88页
第4页 / 共88页
第5页 / 共88页
第6页 / 共88页
第7页 / 共88页
第8页 / 共88页
第9页 / 共88页
第10页 / 共88页
亲,该文档总共88页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
设计模式,定制人员:严海全 审核人员:李洪强、梁黎、张应能、向飞、李庚、刘晓静 实施日期:2011-8-18,培训目的,通过本课程的学习,您将能够: 学习设计模式可复用面向对象软件的基础一些的基础知识。 学会使用几种设计模式,每种讲到的模式,都有个人经历过的项目中的应用举例。 适用对象:软件开发人员,培训大纲,设计模式可复用面向对象软件的基础基础学习 为什么需要设计模式(Design Pattern) OMT表示方法 23个设计模式的组织 面向对象的一些设计原则 几种设计模式介绍 Singleton(单件) Adapter(适配器) Observer(观察者) Mediator(中介者) Command(命令) State(状态) Strategy(策略),设计模式可复用面向对象软件的基础基础学习 为什么需要设计模式(Design Pattern),面向对象程序设计OOP 基本原则:计算机程序是由单个能够起到子程序作用的单元或对象组合而成。 OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。 面向对象的三个特征:封装、继承、多态 面向对象的设计程序语言 完全的面向对象的语言:Smalltalk、JAVA、C# 进化到面向对象的语言:C-C+,C-Objective-C,BASIC-Visual Basic-Visual Basic .NET,Pascal-Object Pascal,Ada-Ada95 面向对象的建模语言:UML,设计模式可复用面向对象软件的基础基础学习 为什么需要设计模式(Design Pattern),使用面向对象的程序设计语言在开发中最痛苦的是什么? 1,选择太多,无从下手: publicprotectedprivate 继承组合聚 实现继承接口继承 成员变量局部变量 简单设计复杂设计 2,没有正确答案: 不知道我们是否真正的实现了面向对象的要求,看别人写的东西都是垃圾,自己写的东西慢慢也成为了垃圾,最后就是痛苦一个难题没有正确答案往往都很痛苦。 问题总结为:怎样才能实现好的设计,什么才是好的设计高可复用性,高灵活性,高扩展性高内聚,低耦合,设计模式可复用面向对象软件的基础基础学习 为什么需要设计模式(Design Pattern),设计模式的第一章就告诉了我们一种答案 “选择太多,无从下手”的解答: 一下子就得到复用性和灵活性好的设计,不可能或非常困难。 内行的设计者:复用以前使用过的可行的软件设计解决方案。 “没有正确答案”的解答: 已经验证过的被多次使用的面向对象的设计就是很好的设计。 设计模式这本书的目的就是将面向对象软件的设计经验作为设计模式记录下来,所以可以作为面向对象的设计的“武林秘籍”。我们看懂了这本书,加上灵活应用,就可以说是行家,就可以站在巨人的肩膀上作出好的设计。,设计模式可复用面向对象软件的基础基础学习 为什么需要设计模式(Design Pattern),设计模式 定义:每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。 四个基本要素:模式名称、问题、解决方案、效果 描述方式:模式名和分类、意图、别名、动机、适用性、结构、参与者、协作、效果、实现、代码示例、已知应用、相关模式 编目:23个设计模式,3个类别(创建型、结构型、行为型),类,实例化,继承,抽象类和实现伪代码,混入类和多继承,委托关联/依赖,聚合或相识,OMT表示法,OMT表示法,设计模式可复用面向对象软件的基础基础学习 面向对象的设计原则,面向对象的一些设计原则 1.6.1寻找合适的对象:什么时候设计类,候选词分析法,多个设计模式创造了一些类。 1.6.2决定对象的粒度:多个设计模式可以优化对象的粒度。 1.6.3指定对象接口:候选词分析法,多个设计模式也有指导。 1.6.4描述对象的实现 区分类继承与接口继承:简单理解C+纯虚函数类(抽象类) 针对接口编程而不是针对实现编程(原则一):简单理解,为了复用,多使用抽象类,而实现对象的创建使用创建模式来创建。优先考虑接口的设计是复用的关键。 1.6.5运用复用机制 继承与组合的比较:优先使用对象组合,而不是类继承(原则二) 。继承有很多缺点,组合体现了封装性,组合可以达到少的类多的对象提高复用。 委托:类似UML中的依赖关系,关键点是可以创造一些委托对象(设计考虑的),来简化类的复杂度,提高复用度。(用得最多) 继承和参数化类型的比较:参数化类型也就是C+中的模板,书里没有对应的模式。,设计模式可复用面向对象软件的基础基础学习 面向对象的设计原则,面向对象的一些设计原则 1.6.6关联运行时刻和编译时刻的结构: 我的理解:这里的编译时刻确定的代码结构指的每个对象的大小,各个对象之间的依赖关系,是静态的;运行时刻才能确定的结构指对象的数量、生命周期和所属关系等等,这是动态的。 聚合与相识的区别:为了说明运行时刻和编译时刻而举的一个(有点糊涂)的例子。简单点就是,A有B类型的指针,B的属于A(B在A内部创建销毁)就是聚合,A只是使用到B,A和B的生命周期没有直接关系就是相识。 1.6.7设计应支持变化 关键:在于对新需求和已有需求发生变化时的预见性。,学习几种设计模式 Singleton(单件),学习几种设计模式 Singleton(单件),意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 适应性:简单的说,就是代替全局对象。 结构:,学习几种设计模式 Singleton(单件),实现: 实现唯一的实例:构造函数是protected的,static全局函数获取对象。 创建Singleton的子类:别学了。 问题: 如何销毁?,学习几种设计模式 Singleton(单件),应用举例: / xtp皮肤库使用 CXTPColorManager ,学习几种设计模式 Singleton(单件),网上“设计模式与追MM”:(刚才做了个梦) 俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Singleton,她们只要说道“老公”,都是指的同一个人,那就是我。 巧妙之处:一点小技巧,可以保证一个类只能实例化一次,并且可代替全局对象。,学习几种设计模式 Adapter(适配器),学习几种设计模式 Adapter(适配器),意图:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 别名:Wrapper 适应性: 以下情况使用Adapter模式 你想使用一个已经存在的类,而它的接口不符合你的需求。 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。 (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。,学习几种设计模式 Adapter(适配器),结构:,学习几种设计模式 Adapter(适配器),实现: 抽象类 对象组合(推举)或私有继承,学习几种设计模式 Adapter(适配器),应用举例1:,学习几种设计模式 Adapter(适配器),应用举例2: / CU和NCUI中,解码器代码: class IDecoderAdapter /创建解码器 virtual BOOL CreateDecoder(HWND hMonitorWnd) = 0; /设置视频显示窗口 virtual BOOL SetPlayHwnd(HWND hMonitorWnd) = 0; virtual BOOL StartPlayStream(BOOL bVideo, WORD wVideoPort, BOOL bAudio, WORD wAudioPort) = 0; /停止播放码流 virtual BOOL StopPlayStream() = 0; . class CKdmDecAdapter : public IDecoderAdapter,学习几种设计模式 Adapter(适配器),应用举例3: 架构中使用:,学习几种设计模式 Adapter(适配器),网上“设计模式与追MM”:在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我) 。 巧妙之处:系统核心逻辑不需改,通过外围修改就可以扩充功能,是扩充协议、复用同类模块的灵丹妙药。,学习几种设计模式 Observer(观察者),学习几种设计模式 Observer(观察者),意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 别名:发布-订阅(Publish-Subscribe) 适应性: 在以下任一情况下可以使用观察者模式: 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。,学习几种设计模式 Observer(观察者),学习几种设计模式 Observer(观察者),结构,学习几种设计模式 Observer(观察者),结构,学习几种设计模式 Observer(观察者),实现,学习几种设计模式 Observer(观察者),实现,学习几种设计模式 Observer(观察者),应用举例1: NCUI数据管理与界面更新 class CObserver; class CSubject public: CSubject(void); virtual CSubject(void); virtual void Attach(CObserver* po); virtual void Detach(CObserver* po); void Notify(CObserver* pSender, LPARAM lHint = 0L, LPVOID pHint = NULL); void ClearObservers(); protected: CList m_Observers; ;,学习几种设计模式 Observer(观察者),应用举例1: NCUI数据管理与界面更新 class CObserver public: CObserver(void); virtual CObserver(void); virtual void OnNotify(CObserver* pSender, LPARAM lHint, LPVOID pHint); ; class CNcDataManager : public CSubject / 管理所有的客户端数据 class CBodyMonitor : public CBodyBase, public CObserver / 多画面窗口 class CBodyTVWall : public CBodyBase, public CObserver / 电视墙多画面窗口 class CPaneEncodereEx : public CPaneBase, public CObserver / 设备树面板 class CPanePTZCtrl : public CPaneBase, public CObserver / PT
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号