某科技公司设计模式培训

上传人:唐****1 文档编号:243664829 上传时间:2024-09-28 格式:PPT 页数:88 大小:2.17MB
返回 下载 相关 举报
某科技公司设计模式培训_第1页
第1页 / 共88页
某科技公司设计模式培训_第2页
第2页 / 共88页
某科技公司设计模式培训_第3页
第3页 / 共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& AFX_CDECL CXTPColorManager:Instance(),static CXTPColorManager instance;,return instance;,/ SVR客户端通讯库使用,CNMSLib* CNMSLib:GetInstance(),static CNMSLib instance;,return ,学习几种设计模式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 / PTZ控制面板,class CBodyPlayer : public CBodyBase, public CObserver / 录像回放控制面板,class CPaneRecCalendar : public CPaneBase , public CObserver / 录像回放月历面板,学习几种设计模式Observer(观察者),应用举例1: NCUI数据管理与界面更新,/ 电子地图告警数据,class CEmapAlarmData : public CSubject,/ 电子地图告警数据相关的UI,class CDlgEMapAlarmList : public CDialog, public CObserver,class CEmapListBox : public CNcListBox, public CObserver,学习几种设计模式Observer(观察者),应用举例2: SVR Station数据管理与界面更新,/ 通知消息,const u16 WM_DM_LOCAL_LOGGED_IN = (WM_UI_MSG_BEGIN+6);/ 本地已登录成功,const u16 WM_DM_LOCAL_LOGGED_OUT = (WM_UI_MSG_BEGIN+7);/ 本地已登出完成,/ 客户端数据管理,class CNMSDataMgr,public:,void RegDMTarget(HWND hWnd, u16 wDM, BOOL bMoveToFirst = FALSE);/ 注册消息目标,BOOL UnregDMTarget(HWND hWnd, u16 wDM); / 反注册消息目标,void ClearDMTargets();,void NotifyDMTarget(u16 wDM, WPARAM wParam = 0, LPARAM lParam = 0, BOOL bPost = TRUE);,protected:,TNMSDb* m_pDbFile;/ 数据文件内容,protected:,typedef setTgtArray;,typedef mapMsgTgtMap;,MsgTgtMapm_aTgtMap; / Target对应表,;,学习几种设计模式Observer(观察者),应用举例2: SVR Station数据管理与界面更新,BOOL CMainDevTreePane:OnInitDialog(),m_pMainWnd-GetDataMgr()-RegDMTarget(m_hWnd, WM_DM_LOCAL_LOGGED_IN);,m_pMainWnd-GetDataMgr()-RegDMTarget(m_hWnd, WM_DM_LOCAL_LOGGED_OUT, TRUE);,m_pMainWnd-GetDataMgr()-RegDMTarget(m_hWnd, WM_DM_NVR_ADD);,m_pMainWnd-GetDataMgr()-RegDMTarget(m_hWnd, WM_DM_NVR_MODIFY);,m_pMainWnd-GetDataMgr()-RegDMTarget(m_hWnd, WM_DM_NVR_DELETE);,void CMainDevTreePane:OnDestroy(),m_pMainWnd-GetDataMgr()-UnregDMTarget(m_hWnd, WM_DM_LOCAL_LOGGED_IN);,m_pMainWnd-GetDataMgr()-UnregDMTarget(m_hWnd, WM_DM_LOCAL_LOGGED_OUT);,m_pMainWnd-GetDataMgr()-UnregDMTarget(m_hWnd, WM_DM_NVR_ADD);,m_pMainWnd-GetDataMgr()-UnregDMTarget(m_hWnd, WM_DM_NVR_MODIFY);,m_pMainWnd-GetDataMgr()-UnregDMTarget(m_hWnd, WM_DM_NVR_DELETE);,学习几种设计模式Observer(观察者),网上“设计模式与追MM”:想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦。,巧妙之处:把复杂错乱无序的通过操作,通过订阅的方式变成一对多的关系,而且可以不断扩充观察者。,学习几种设计模式Mediator(中介者),学习几种设计模式Mediator(中介者),意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。,适应性:,在下列情况下使用中介者模式:, 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。, 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。, 想定制一个分布在多个类中的行为,而又不想生成太多的子类。,学习几种设计模式Mediator(中介者),学习几种设计模式Mediator(中介者),学习几种设计模式Mediator(中介者),学习几种设计模式Mediator(中介者),学习几种设计模式Mediator(中介者),结构,学习几种设计模式Mediator(中介者),实现,学习几种设计模式Mediator(中介者),实现,学习几种设计模式Mediator(中介者),实现,学习几种设计模式Mediator(中介者),应用举例1:MFC中对话框窗口编程,学习几种设计模式Mediator(中介者),应用举例2:SVR业务层架构,学习几种设计模式 Mediator(中介者),网上“设计模式与追MM”:四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。,巧妙之处:与观察者模式有异曲同工之妙,把复杂错乱无序的关系,通过“中介”变成一对多的关系,同样可以方便的复用扩展系统。,Mediator与Observer模式的区别:“Mediator模式封装了通讯,而Observer分散通讯,从通讯角度来看,中介者也有其固有的缺陷,容易变成大而全高度耦合的集中器。”,学习几种设计模式Command(命令),学习几种设计模式Command(命令),意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。,适应性:,在下列情况下使用中介者模式:,在不同的时刻指定、排列和执行请求:支持类似Word的宏命令,支持类似PS的动作命令。,支持取消操作:Command接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的“取消”和“重做”。一般需要Memento来保存状态。,支持操作日志,这样当系统崩溃时,这些修改可以被重做一遍。,方便基于原语(基本)操作构建高层操作:Command有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。,学习几种设计模式Command(命令),学习几种设计模式Command(命令),学习几种设计模式Command(命令),结构,学习几种设计模式Command(命令),结构,学习几种设计模式Command(命令),实现,学习几种设计模式Command(命令),实现,学习几种设计模式Command(命令),实现,学习几种设计模式Command(命令),实现,学习几种设计模式Command(命令),实现,学习几种设计模式Command(命令),应用举例:,开发过一个图像处理小软件,需要撤销重做,使用了Command模式和Memento模式。,庭审主机中支持特定场景或语言激励等信号联动PTZ、画面切换、外设控制、VGA矩阵切换等功能,并且可配置,考虑使用Command模式。,学习几种设计模式 Command(命令),网上“设计模式与追MM”:俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面。”,:-(,巧妙之处:命令模式把一个请求或者操作封装到一个对象中,那么操作动作就可以复用且自由管理了。同时如果想实现宏操作、撤销重做,那么就是它了,还附带操作日志特性给你。,学习几种设计模式State,(状态)和Strategy(策略),学习几种设计模式State,(状态),意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。,适应性:,在下面的两种情况下均可使用State模式:,一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。,一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。,学习几种设计模式State,(状态),学习几种设计模式State,(状态),结构,学习几种设计模式State,(状态),实现,学习几种设计模式State,(状态),实现,学习几种设计模式State,(状态),实现,学习几种设计模式State,(状态),实现,学习几种设计模式State,(状态),实现,学习几种设计模式State,(状态),应用举例:类似电子表格数据项处程序,学习几种设计模式State,(状态),应用举例:类似电子表格数据项处程序,class CDataItem : public CChange, public CObject, public CSubject, public CObserver,public:,CDataItem(CDataGroup* pg = NULL, INT nType = itemNumber);,/ CDataItemState实现的函数。,virtual void Update(CDataItem* pItem, CSubject* ps, WPARAM type, LPARAM lp1, LPARAM lp2);,virtual BOOL IsEnableLock(CDataItem* pItem);,private:,void ChangeState(CDataItemState* pState);,CDataItemState* m_state;,学习几种设计模式State,(状态),应用举例:类似电子表格数据项处程序,class CItemStateNormal : public CdataItemState / 普通、文字数据项,public:,static CDataItemState* Instance();,virtual void Update(CDataItem* pItem, CSubject* ps, WPARAM type, LPARAM lp1, LPARAM lp2);,virtual BOOL IsEnableLock(CDataItem* pItem);,protected:,CItemStateNormal() ;,private:,static CItemStateNormal* m_pThis;,;,class CItemStateNumber : public CdataItemState / 数字数据项,class CItemStateTime : public CdataItemState / 时间数据项,class CItemStateSensor : public CDataItemState / 传感器数据项,class CItemStateCalc : public CdataItemState / 表达式数据项,学习几种设计模式 State,(状态),网上“设计模式与追MM”:跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。,巧妙之处:把大类变成小类,按照状态来分别处理,这些状态相互间不影响,可以不断扩充,可以直接切换。,学习几种设计模式Strategy,(策略),意图:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。,适应性:,当存在以下情况时使用Strategy模式,许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。,需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。,算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。,一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。,学习几种设计模式Strategy,(策略),学习几种设计模式Strategy,(策略),结构,学习几种设计模式 Strategy,(策略),网上“设计模式与追MM”:跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。,巧妙之处:把大类变成小类,按照策略(一组算法)来分别处理,这些策略之间互不影响,可以不断扩充,可以直接切换。,策略和状态类都没有所服务主体的环境数据,所以随时替换才成为可能,但是策略模式更加突出行为与环境的分离,随时替换更加自由。,学习方法建议和使用误区提醒,学习建议:,“设计模式不是学出来的,是使用出来的” 。一个建议:问题书本,例子验证,使用。,不要希望一次把所有设计模式搞定,先学会一到两个。,使用误区:,误区1:不理解现有系统,以设计模式的模子来评价系统的好坏,言必称“设计模式”,把设计模式当成“尚方宝剑”。,误区2:在不理解的情况下,过度的使用设计模式,其实每个系统核心的设计模式可能只有一到两个。,误区3:形式主义的使用设计模式,不关注设计模式的核心思想,而在形式上(具体到方法、操作甚至命名)去匹配设计模式的教材。,学习设计的一些书籍推举,Pattern Hatching、设计模式沉思录 , 中的 John M. Vlissides 的一些文章,被整理成书,内容主要是在何时使用设计模式,应用场景。是对 设计模式-可复用面向对象软件的基础 的一些补充,更实践一些。,敏捷软件开发-原则模式与实践 ,Head First 设计模式 ,设计模式解析Pattern Explain 2,nd, ,重构到模式 Refactoring to Pattern ,交流时间,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!