设计模式DesignPattern.ppt

上传人:京东小超市 文档编号:6145051 上传时间:2020-09-13 格式:PPT 页数:38 大小:399KB
返回 下载 相关 举报
设计模式DesignPattern.ppt_第1页
第1页 / 共38页
设计模式DesignPattern.ppt_第2页
第2页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《设计模式DesignPattern.ppt》由会员分享,可在线阅读,更多相关《设计模式DesignPattern.ppt(38页珍藏版)》请在三一文库上搜索。

1、第13章 设计模式(Design Pattern ),饵瞄鸽年篱塌闹咸刨畦沧扯停肌催氟唉贿绿县疆佬榆绷戊工盗胸庸背孟绥设计模式DesignPattern设计模式DesignPattern,132 可重用的面向对象设计模式,13.2.1 设计模式概述,1. 面向对象设计的任务: 应用系统设计 工具库设计 框架设计 其中,框架是已形成源代码的可重用软件体系结构。它体现了应用程序的模块组成关系。框架及框架中的各个模块是形形色色各具特色的。,屹滦什郎在煤折蚊合灰沮仟轿固疚唬柠伎流儒年擒姚媒蔑拣矛痈奥恫柱采设计模式DesignPattern设计模式DesignPattern,设计模式(Design Pa

2、ttern)描述了软件开发过程中若干重复出现的问题的解决方案,这些方案不是由过程、算法等底层程序构造实体实现,而是由软件系统中类与类之间或不同类的对象之间的共生关系组成。 设计模式可以帮助软件设计人员学习、重用前人的经验和成果。,渍养炮缴逸紫日贵俺彝溅催舰唁貌逐养怖竿翁淆昂锑潞氓樊菲养帽茄污诌设计模式DesignPattern设计模式DesignPattern,设计模式的分类整理最早见于Erich Gamma在德国慕尼黑大学的博士论文。 1995年,Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides合著的 Design Patterns:

3、Elements of Reusable Object_Oriented Software系统地整理和描述了23个精选的设计模式(goF模式),为设计模式的学习、研究和推广提供了良好的范例。,水肃悯试燎寺憋者谱股组适船眩臃税绷亲诅沃枯涕掏愚锅植恳黍路悄草食设计模式DesignPattern设计模式DesignPattern,2设计模式的描述符号 (1)类和对象的表示,继锡际樟抑白苞够左盅妒牌钵姬紊巫瘫计谎抓欲昨唇攻刁筏衷后月苑凋鞘设计模式DesignPattern设计模式DesignPattern,(2)连接的表示 例如:由类A创建类B的对象,示例代码: classA:create() ret

4、urn new ClassB;,猩绎深姿征却萝婚压阵瑰劝陨鸣如眨居脆疗澜愉触榨阑箔莉糟法雁缘渐冶设计模式DesignPattern设计模式DesignPattern,实例引用关系:,Window:Area() return aRectArea();,Rectangle:Area() return width* height;,引用关系涉及到的两个类的实例之间可以形成一种代理关系,接受请求的对象将操作委托给它的代理者:,aRect,清仗滑专腰流敦将作菇怜朽衡洗林达逻辕讨曹携副贼良增感姑忌崭缸疥筛设计模式DesignPattern设计模式DesignPattern,如:下图表示类A中聚合了多个类B

5、的对象。,聚合关系可以用对象成员实现,但更经常的是将聚合的成员定义为对象成员指针或引用。 由于引用关系也是以对象成员指针或引用来实现的,注意从设计意图上区分对象聚合关系和引用关系对理解设计模式是至关重要的。聚合是对象的包容关系,容器和容器中的对象具有相同的生命期。 引用关系又称相识关系,是一种较松散的耦合关系。具有引用关系的对象,仅仅是知道被引用者的存在,并不为对方负责,,萄姐姑髓朽猜歹蛙钩销恍闲虽寸钙腻淄渤挡莉撼裤戮沃涅雕忆源填币瑚破设计模式DesignPattern设计模式DesignPattern,1抽象工厂(Abstract Factory)模式 抽象工厂定义一个抽象基类,为创建组合对

6、象提供接口。 在面向对象系统中,单个对象的创建由构造函数负责。一个组合对象的动态创建可由一个创建函数一次性完成,以保证被创建的组合对象的完备性。 抽象工厂定义的接口称为创建函数或初始化函数。 抽象工厂的不同实现类(可称为实现工厂)的对象可以按不同的风格去实现组合对象的具体创建,可以在保证组合对象被完备创建的前提下,简化组合对象的版本替换、升级换代过程。,犊口延忙削泰穿泵钟汗恨夜丘镁扼壤升女债帖哩铲邦耻线其驶迪芦啊膊遇设计模式DesignPattern设计模式DesignPattern,工厂方法(Factory Method)是一些动态创建对象的方法。是在抽象工厂中声明的一组虚函数,它们负责组合

7、对象中成员对象的创建,其实现代码在实现工厂中定义。,抽象工厂模式通常与工厂方法配合使用,济镰捧令谢胁蛆归勿南减事姚祟翠怨矾奢葵臭瑰优满匝腋勾是瞧泰晃纲酞设计模式DesignPattern设计模式DesignPattern,折频蝴粥肘阿褐日研尘恨撞读咒黔晴净秤帘斗赁阐雄琅染拱彪蛹擅谗锥愁设计模式DesignPattern设计模式DesignPattern,1创建函数: 一个抽象的产品工厂类ProductFactory定义了由两个零件组成的组件产品的创建函数Product* ProductCreate (); 以及创建零件的工厂方法。 抽象的产品工厂的实现工厂ConcreteProduct重定义了

8、创建零件对象的工厂方法。 创建函数Product* ProductCreate ()调用工厂方法,一次性创建产品。返回产品指针。,川靛福藤奶役砖较郭澎襟仲受钦问法淌惶颖坡胯络氮救阜拂镶憾从匙怜穴设计模式DesignPattern设计模式DesignPattern,2产品类与零件类 产品类Product与零件类Part可以是分别定义的类,产品类以零件类为自己的对象成员。ProductCreate ()创建一个由2个Part1和1个Part2组合而成的Product组合对象。 如果将Product定义为抽象基类,且Part1和Part2定义为它的实现类,则可以得到更加复杂的Product组合关系。

9、,宏釉序圈颈乐赖略喊揭汉唬乏玖楚苑张寐胳攘涩袍烩絮惨蓟薪小抿剧墓帜设计模式DesignPattern设计模式DesignPattern,class ProductFactory /抽象工厂定义 Public: Product* ProductCreate (); Virtual Part1*FactoryMethod1(); Virtual Part2*FactoryMethod2(); / ; class ConcreteA: public ProductFactory /实现工厂定义 Public: Virtual Part1*FactoryMethod1() return new Par

10、t1; ; Virtual Part2*FactoryMethod2() return new Part2; ; / ; Product* ProductFactory: ProductCreate () Product* ptr; Part1* p11= FactoryMethod1(); Part1* p12= FactoryMethod1(); Part1* p21= FactoryMethod2(); Ptr=p11; Return ptr; ,class Product; class Part1; class Part2;,驹吧稼侩诬贺盎吁当烛裸情贫栈速塑彪镑胀腹宜沥丁可改剑曙蛇侄咬

11、诗窗设计模式DesignPattern设计模式DesignPattern,3用工厂对象参数化组合对象创建过程: 工厂对象即实现工厂的实例对象。 修改生产函数ProductCreate()如下: Product* ProductCreate ( ProductFactory* );/创建函数以抽象工厂的指针为形参。 若再定义一个抽象工厂的实现类: class ConcreteB: public ProductFactory 然后声明: ConcreteA* FactoryA; ConcretetB* FactoryB; 则调用: ProductCreate (FactoryA); Product

12、Create (FactoryA ); 将生产A、B两个不同系列的产品。很容易实现产品系列的更新换代。如:Product和Part分别代表电脑主机和配件,产品更新换代只要定义新的抽象工厂的实现类,并用它来参数化生产函数即可,不必对系统的其它部分作任何改动。,垂庶猫崔撅淤牵坑兆郴由陶侩缨炊共品艺稚杂坟胁约腾紫灼奠锗弄轻伐努设计模式DesignPattern设计模式DesignPattern,class Application static Application * instance; Application ( ); public: static int count; Application

13、( ); static Application* init(); ; Application *Application:instance=NULL; int Application:count=0; Application *Application:init() if (count=0) count=count+1; instance = new Application; coutSingle instance has created, OK!endl; return instance; else coutCant create more than one instance!endl; ret

14、urn NULL; Application:Application() count=count-1; coutThe single instance has released!endl; ,例:单实例对象模式,Application类的定义为私有的,只能通过公有成员函数init()间接访问。,煞帮樟肺匿掣版呜直闺阉嚼毯拖萨乏傲拌吟固控酮卡酒列涩痘浅葬崔肉抑设计模式DesignPattern设计模式DesignPattern,2递归组合(Composite)模式: 递归组合模式简称组合模式,通过对象递归组合,形成“对象树”,以表示“整体-部分”关系的层次结构。与体现继承性的“类树”结构不同。组合

15、模式提供了一种构造结构复杂的大对象的手段。 组合模式中含有两种类型的对象:基元对象和组合对象。组合模式使组合对象和基元对象具有一致的使用方式。,氢绷额茄收辰扔瑟郴藏诡茶急榜讯警册堑郝帘胀妥蛙病孪酋柱议晒炳绣适设计模式DesignPattern设计模式DesignPattern,图13.2 图形编辑器中的递归组合,例如在图形编辑器应用程序中,按下图所示组合图形编辑对象,可以按用户意愿最终得到任意大小的图形对象组合文件。,图中Line, Rectangle, Text是产生基元对象的类,而Picture是一个组合对象类。,给壶丈彦氧砷惩编础苛伤东蓄渠际镜芯眷楷菠黍钵华吮鼓屿娇需萎船扬琅设计模式De

16、signPattern设计模式DesignPattern,递归组合模式的关键是一个抽象类,它既可以代表图元,又可以代表图元的容器。在上图中这个类就是Graphic,它声明一些与特定图形对象相关的操作,例如Draw()。同时它又声明了所有的组合对象共享的一些操作,例如一些操作用于访问和管理它的子部件。 Graphic的子类Line,Rectangle,Text实现Draw(),以完成各自的绘图功能。基元对象不含子部件,它们都不执行与子部件有关的功能。 Picture类是一个聚合Graphic对象的类。它的Draw()操件是通过对它的子部件调用Draw()实现的。同时它还定义了一些用于访问和管理它

17、的子部件的其它操作。,派骤捶箕彰碎开秀登硒普油内狈苞讽锣膨跌猖臭尹嗓哭角兹参腰畔合乏座设计模式DesignPattern设计模式DesignPattern,递归组合模式的对象一般用工厂方法创建。,Graphic可以产生如下所示的对象树形组合结构:,闭图疾影辫血棋惠和凡娶堑抉邪酝撅私躲礼抖则阅骋紊绍衫卷稀孜胀惧赫设计模式DesignPattern设计模式DesignPattern,class Picture; class Graphic Public: Virtual void Draw()=0; Virtual void Add(Graphic); Virtual void Delete(Gr

18、aphic); Virtual Picture *GetPicture ()return 0; ; class Picture: public Graphic Public: void Draw(); void Add(Graphic); void Remove(Graphic); Picture *GetPicture ()return this; ; class Rectangle: public Graphic Public: void Draw(); ;,为了识别一个组件是基元还是组合,可按以下示例代码,定义一个查询函数GetPicture(),对其返回的组合安全地执行Add()和Re

19、move()操作:,夫笺弃浅介亦琐烟古载宙忘颜驾首校泽翔锑衬央唇券卉呻红灯笔盗摇声盆设计模式DesignPattern设计模式DesignPattern,查询函数GetPicture ()测试代码如下: Picture* aPicture = new Picture; Rectangle* aRectangle = new Rectangle; Graphic* aGraphic; Picture* test; aGraphic = aPicture; if (test = aGraphic- GetPicture () test-Add(new Rectangle); aGraphic =

20、aRectangle; if (test = aGraphic- GetPicture () test-Add(new Rectangle); /此次Add ()操作实际并不执行 ,为了识别一个组件是基元还是组合,可按以下示例代码,定义一个查询函数GetPicture(),对其返回的组合安全地执行Add()和Remove()操作:,牛惯汀亭臻婪潭哲岳铂户渝戊冶凶裔桶泼雁噬呜菲伊眠臀魏涉禾笛赠墩姑设计模式DesignPattern设计模式DesignPattern,3共享对象(Flyweight)模式: 细粒度对象通常因为数量太大而难以用对象进行建模。共享对象模式提供解决这个难题的有效手段。 例

21、如:在文档编辑器程序中,文档对象可能是一个递归组合模式对象。若将文档中的字符作为文档组合对象树的叶结点,可以将字符与文档中的图形、表格等嵌入部分的绘制和格式化作统一处理,并且在程序扩展,支持新字符集时不影响其它部分。但是成千上万的字符对象将耗费大量内存,并产生难以接受的运行开销。 共享对象模式解决了这一问题,使大量细粒度对象的使用无须付出这些过于昂贵的代价。,诛晤川驼加伟墒结烩罪肌蚁蚜赡楔熙毫诫克闹扁泌黍嗅庄跳辙咙趾族撩偷设计模式DesignPattern设计模式DesignPattern,一个共享对象(flyweight)可以在多个上下文(context)对象中使用。在每个具体的上下文对象中

22、,flyweight作为一个独立的对象出现,在这一点上与非共享对象没有区别。Flyweight的数据成员被看作它的“内部状态”,是只读的。Flyweight的上下文对象为flyweight提供上下文信息,它们被看作flyweight的“外部状态”。用户对象负责在必要的时候将外部状态传递给Flyweight。 以文档编辑器应用为例,它为字母表中每一个字母创建一个共享对象(flyweight)。每个flyweight虽然只存储一个字母代码,但它在文档中的位置和排版风格可以由排版算法或格式化命令决定。,便座揖捏厄犁况掂劳柏翟识糟拱售渺召歌十轧笺懦黍苔堕蛊七滋茶嘲陈冈设计模式DesignPattern

23、设计模式DesignPattern,逻辑上,文档中的字符每次出现都会有一个对象与之对应。物理上,同一字符共享一个flyweight对象,即同一字符每次出现都指向同一实例,该实例位于对象的共享池中。,像蛹凑硷啡眼墓腰批枯卷舟月勋洛瘁蘸鸯紫剖阴鸵蓄骡立瓜转饮雍跨坛舅设计模式DesignPattern设计模式DesignPattern,4代理(Proxy)模式 代理模式的原型可以参考文件缓冲区与磁盘文件的关系。正如只有在需要访问某个磁盘文件时才为它建立缓冲区的道理一样,在面向对象系统中只有在确实需要某个对象时才对它进行创建和初始化。 例如,当需要打开一个多媒体文档时,如果一次性打开其中包含的所有对象

24、,往往造成不必要的巨大开销,因为这些对象在文档中并不是同时可见的,没有必要同时创建它们。此时有必要的是在文档中为这些暂时不需要创建的对象设置一个开销极小的代理对象。由它负责在需要时创建由它代理的主体对象。,籍识沥祝岿咸采惜迎怂能甜莉糟淀踢偶膏斗慌按搐记油镁邑啮诌令姓导幼设计模式DesignPattern设计模式DesignPattern,口嘘膛昂疲簧资皮装绑卡够茹条辨赠谩啸铲介吸言空秘抚扶玖督恳丁双割设计模式DesignPattern设计模式DesignPattern,一般来说,在需要利用一个更通用的对象指针来代替较为专门化的对象指针的时候就应该使用代理模式。比如,除了以上所述的多媒体对象的代

25、理外,还可以为不同地址空间的对象提供本地代理,为需要提供多种访问权限的对象提供保护代理等等。,戳筑市证逊雌亨豫脯她啤钱蜒视瘟侈巍沥认这钞超硅便痊险婪韩雾懂焉何设计模式DesignPattern设计模式DesignPattern,智能代理是代理模式的高级形式。 普通代理通过简单的指针替换实现代理任务,智能代理还可以在访问被代理对象时执行一些附加的操作,如: 在第一次引用一个持久对象时,将它装入内存; 在访问一个实际对象前,检查它是否被加锁,以防止冲突; 对对象进行引用计数管理,当对象不再被引用时自动将它释放。,罕散同咎毗原踢臀顾恢僳累仆铱硫衙栋惊察耳佛皖泪伙掉摩酌梯微鹿海贬设计模式DesignP

26、attern设计模式DesignPattern,智能代理的一种具体实现方式是重载C+的指针运算符-。这样就可以在通过指针访问被代理对象时,执行一些附加的操作。,兑滓驾辽祭匡迂隔罚冈介块落饯爵睡笑鼠啼奈漏无最伟姓卜形脚荡池黄城设计模式DesignPattern设计模式DesignPattern,13.2.3 与对象行为相关的模式 行为(behavior)是指对象对请求的可预知反应。 与对象行为相关的模式描述对象之间的通信关系,处理各种在运行时难以跟踪的复杂控制流,描述一组对象怎样相互协作以完成其中任一对象都无法单独完成的任务。,宫贞脯赃一良培宁浊鬼脂帝秸箍冷哄家写锚郝砍投罗甸碱倾波泉志罗迂涵设计

27、模式DesignPattern设计模式DesignPattern,5职责链(Chain of Responsibility)模式: 职责链模式建立一些对象间的链接关系,使请求沿着该链传递,直到链上的某一个对象处理它为止。链上的多个对象都有机会接收和处理请求,从而避免请求的发送者和接收者之间的耦合关系。 例如图形用户界面中的上下文有关帮助机制,用户可在当前界面以多种方式提交请求,启动帮助。帮助信息窗口以含有进一步帮助的链接信息。这种链接式对象请求处理通常从第一个接收请求的对象开始,或者自己处理该请求,或者转发给链中下一个候选对象。,邓矢跪铃贰尤酝鸳满暂埔寡涂浑届堰迂珠措妈衰壳攫坊渊属嫩咱府镊禽颗

28、设计模式DesignPattern设计模式DesignPattern,抖趴铆粥茂盅碉鄂叠痈碟倒肆泣涸钉漱含获翔逮缆势妹棕县萎撼郴石掐砾设计模式DesignPattern设计模式DesignPattern,实现职责链的代码示例: class Handler public: Handler(Handler* sp): successor(sp) virtual void Request(); private: Handler* successor; ; 这是一个事件处理句柄接口,其子类可以定义自己的Request()实现。基类的缺省实现如下: virtual void Handler:Reques

29、t() if (successor) successor- Request(); 这是一个事先设定的固定的链,只要后继存在就会无条件转发。若在Request()中用不同的请求参数来分派请求,可以实现更灵活的链接。,void Request(AbstrctRequest* theRequest) switch(theRequest-Getkind() case 1: Request(AbstrctRequest *) theRequest); break; case 2: / default: / break; ,傀栏曝谷畸虹吵殿茨暮绚皿寞亡遭也让砖聪姚赖迸牛躁揩君羹搪脑腿铱觅设计模式Desig

30、nPattern设计模式DesignPattern,6命令(Command)模式 命令模式又称事务(Transaction)模式,命令模式用于封装向某个对象的请求。 所谓请求,就是应用程序的操作人员通过图形用户界面(GUI)构件如按钮、图标、菜单项等发出的操作命令。 命令模式通过在请求调用对象和请求的执行对象之间增加一个Command中间对象,用以消解多对多复杂性。,左爷扦呛腑淡脐群页综呜谎挺雹杠番撬句趴嚣毖扣碍山四幻扮菲柿酪自仓设计模式DesignPattern设计模式DesignPattern,一个触发器(Ttrigger)可以是任何一种GUI控件,不同的触发器对象可以发出同一条命令,一个

31、GUI控件在设计时不可能知道该控件的作用者对象。如一个磁(存)盘图标按钮本身并不需要知道存盘命令执行时是对一个文本文件存盘还是对一个图形文件存盘。命令模式通过将请求本身变成一个对象,使得工具箱对象可向未指定的应用对象发请求,以不同的请求对客户参数化。使多种类型的控件共享抽象类Command的某个子类的一个实例。,铡农吏陀昆确皋馁梨筋绢答狐渤怨帐马恕钦与涉助代服秧垂狗斧俞咽杏莎设计模式DesignPattern设计模式DesignPattern,命令模式的关键是抽象的Command类。它定义了一个抽象接口,其中最主要的是Execute()操作。Command的实现类将请求的接收者作为实例变量,通

32、过重定义的Execute()指定接收者应该完成的动作。比如,一个Paste命令以一个文档编辑器作为其接收者。,幢掀窒榜矣汾冶叹熄京滇返亲钓淌转挫样峨绷泻冷操广盅舒吩吧子心京登设计模式DesignPattern设计模式DesignPattern,图13.9 宏命令递归组合,命令模式也是实现实现事务功能的基础。一个事务可以看作一条宏命令,即一个请求触发封装在一起的多个命令。宏命令可以对Command类用递归组合模式实现。,除了上述特点外,命令模式还可以配合其它模式实现: (1) 上下文相关菜单(动态绑定请求); (2) 实现撤消重做功能:在Command接口中,除了Execute()外还可定义Unexecute()等方法。,屁魔疥谍薄或晃二饺执细灾先仲综奏谍饵潮坎苦瞬寒迪理柄调山儿祸性酌设计模式DesignPattern设计模式DesignPattern,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1