结构型模式组合模式精选文档.ppt

上传人:石*** 文档编号:70752635 上传时间:2023-01-27 格式:PPT 页数:43 大小:1.98MB
返回 下载 相关 举报
结构型模式组合模式精选文档.ppt_第1页
第1页 / 共43页
结构型模式组合模式精选文档.ppt_第2页
第2页 / 共43页
点击查看更多>>
资源描述

《结构型模式组合模式精选文档.ppt》由会员分享,可在线阅读,更多相关《结构型模式组合模式精选文档.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、结构型模式组合模式本讲稿第一页,共四十三页上篇回顾上篇回顾装饰者模式装饰者模式装装饰饰者者模模式式:动动态态地地将将职职责责附附加加到到对对象象上上。若若要要扩扩展展功功能能,装装饰饰者者提提供供了了比比继继承承更更有有弹弹性性的的替替代代方案。方案。2 2本讲稿第二页,共四十三页3 3组合模式组合模式组合模式有时候又叫做部分组合模式有时候又叫做部分-整体模式,它整体模式,它使我们树型结构的问题中,模糊了简单元素和使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与素一样来处理复杂元素,

2、从而使得客户程序与复杂元素的内部结构解耦。复杂元素的内部结构解耦。本讲稿第三页,共四十三页4 4生活中的例子生活中的例子组合模式将对象组合成树形结构以表示组合模式将对象组合成树形结构以表示部分部分-整体整体的层次结构。让用户一致地使用单个对的层次结构。让用户一致地使用单个对象和组合对象。虽然例子抽象一些,但是算术象和组合对象。虽然例子抽象一些,但是算术表达式确实是组合的例子。算术表达式包括操表达式确实是组合的例子。算术表达式包括操作数、操作符和另一个操作数。操作数可以是作数、操作符和另一个操作数。操作数可以是数字,也可以是另一个表达式。这样,数字,也可以是另一个表达式。这样,2+3和和(2+3

3、)+(4*6)都是合法的表达式。)都是合法的表达式。本讲稿第四页,共四十三页5 5生活中的例子生活中的例子本讲稿第五页,共四十三页6 6生活中的例子生活中的例子在在Word中中我我们们经经常常会会将将一一些些图图形形元元素素进进行行“组组合合”,组组合合以以后后的的图图形形还还可可以以向向简简单单图图元元那那样样进进行行移移动动、变变形形等等等等操操作作;除除此此以以外外,在在Word中中,我我们们对对于于一一个个字字符符、一一个个词词组组、一一句句话话、一一个个段段落落,甚甚至至是是整整篇篇文文章章的的操操作作是是相相同同的的,我我们们都都可可以以进进行行剪剪切切、复复制制,进进行行字字体体

4、与与大大小小的的调调整整,进进行行颜颜色色的的变变换换。这这些些例例子子都都是是Composite模模式式的的实实例例,我我们们将将简简单单的的元元素素组组合合成成复复杂杂的的元元素素,然然后后还还可可以以像像操操作作简简单单元元素素那样操作组合元素。那样操作组合元素。本讲稿第六页,共四十三页7 7认识装饰者模式认识装饰者模式结构结构本讲稿第七页,共四十三页8 8认识装饰者模式认识装饰者模式参与者参与者Component为组合中的对象声明接口。为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理声明一个接

5、口用于访问和管理Component的子组件。的子组件。在递归结构中定义一个接口,用于访问一个父组件,并在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现。在合适的情况下实现。Leaf在组合中表示叶节点对象,叶节点对象没有子节点。在组合中表示叶节点对象,叶节点对象没有子节点。在组合中定义图元对象的行为。在组合中定义图元对象的行为。本讲稿第八页,共四十三页9 9认识装饰者模式认识装饰者模式参与者参与者Composite定义有子部件的那些部件的行为。定义有子部件的那些部件的行为。存储子部件。存储子部件。在在Component接口中实现与子部件有关的操作。接口中实现与子部件有关的操作。

6、Client通过通过Component接口操纵组合部件的对象。接口操纵组合部件的对象。本讲稿第九页,共四十三页1010示例示例通通过过一一些些基基本本图图像像元元素素(直直线线、圆圆等等)以以及及一一些些复复合合图图像像元元素素(由由基基本本图图像像元元素素组组合合而而成成)构构建建复复杂杂的的图图形形。在在设设计计中中我我们们对对每每一一个个对对象象都都配配备备一一个个Draw()方方法法,在在调调用用时时,会会显显示示相相关关的的图图形形。可可以以看看到到,这这里里复复合合图图像像元元素素它它在在充充当当对对象象的的同同时时,又又是是那那些些基基本本图图像像元元素素的的一个容器。一个容器。

7、本讲稿第十页,共四十三页1111示例示例本讲稿第十一页,共四十三页1212第一次尝试第一次尝试namespace NoPattern public abstract class Graphics protected string name;public Graphics(string name)this.name=name;public abstract void Draw();本讲稿第十二页,共四十三页1313第一次尝试第一次尝试using System;namespace NoPattern public class Line:Graphics public Line(string nam

8、e):base(name)/public override void Draw()Console.WriteLine(Draw a+name.ToString();本讲稿第十三页,共四十三页1414第一次尝试第一次尝试using System;namespace NoPattern public class Circle:Graphics public Circle(string name):base(name)/public override void Draw()Console.WriteLine(Draw a+name.ToString();本讲稿第十四页,共四十三页1515第一次尝试第

9、一次尝试using System;namespace NoPattern public class Rectangle:Graphics public Rectangle(string name):base(name)/public override void Draw()Console.WriteLine(Draw a+name.ToString();本讲稿第十五页,共四十三页1616第一次尝试第一次尝试using System;using System.Collections;namespace NoPattern public class Picture:Graphics public

10、Picture(string name):base(name)/public override void Draw()/public ArrayList GetChild()/本讲稿第十六页,共四十三页1717存在的问题存在的问题现在我们要对该图像元素进行处理:在客户端现在我们要对该图像元素进行处理:在客户端程序中,需要判断返回对象的具体类型到底是程序中,需要判断返回对象的具体类型到底是基本图像元素,还是复合图像元素。如果是复基本图像元素,还是复合图像元素。如果是复合图像元素,我们将要用递归去处理,然而这合图像元素,我们将要用递归去处理,然而这种处理的结果却增加了客户端程序与复杂图像种处理的结

11、果却增加了客户端程序与复杂图像元素内部结构之间的依赖,那么我们如何去解元素内部结构之间的依赖,那么我们如何去解耦这种关系呢?耦这种关系呢?本讲稿第十七页,共四十三页1818使用组合模式使用组合模式透明方式透明方式我们希望的是客户程序可以像处理基本图像我们希望的是客户程序可以像处理基本图像元素一样来处理复合图像元素,这就要引入元素一样来处理复合图像元素,这就要引入Composite模式了,需要把对于子对象的模式了,需要把对于子对象的管理工作交给复合图像元素,为了进行子管理工作交给复合图像元素,为了进行子对象的管理,它必须提供必要的对象的管理,它必须提供必要的Add(),Remove()等方法。等

12、方法。本讲稿第十八页,共四十三页1919使用组合模式使用组合模式透明方式透明方式本讲稿第十九页,共四十三页2020示例代码示例代码namespace CompositPattern public abstract class Graphics protected string name;public Graphics(string name)this.name=name;public abstract void Draw();public abstract void Add(Graphics g);public abstract void Remove(Graphics g);本讲稿第二十页,

13、共四十三页2121示例代码示例代码using System;namespace CompositPattern public class Line:Graphics public Line(string name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();public override void Add(Graphics g)/public override void Remove(Graphics g)/本讲稿第二十一页,共四十三页2222示例代码示例代码using Sys

14、tem;namespace CompositPattern public class Circle:Graphics public Circle(string name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();public override void Add(Graphics g)/public override void Remove(Graphics g)/本讲稿第二十二页,共四十三页2323示例代码示例代码using System;namespace Composit

15、Pattern public class Rectangle:Graphics public Rectangle(string name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();public override void Add(Graphics g)/public override void Remove(Graphics g)/本讲稿第二十三页,共四十三页2424示例代码示例代码using System;using System.Collections;namespace

16、 CompositPattern public class Picture:Graphics protected ArrayList picList=new ArrayList();public Picture(string name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();foreach(Graphics g in picList)g.Draw();public override void Add(Graphics g)picList.Add(g);public over

17、ride void Remove(Graphics g)picList.Remove(g);本讲稿第二十四页,共四十三页2525示例代码示例代码using System;using System.Collections;namespace CompositPattern public class Picture:Graphics protected ArrayList picList=new ArrayList();public Picture(string name):base(name)/public override void Draw()Console.WriteLine(Draw a

18、 +name.ToString();foreach(Graphics g in picList)g.Draw();public override void Add(Graphics g)picList.Add(g);public override void Remove(Graphics g)picList.Remove(g);本讲稿第二十五页,共四十三页2626示例代码示例代码using System;namespace CompositPattern public class Tester public static void Main()Picture pic=new Picture(R

19、oot);pic.Add(new Line(Line);pic.Add(new Circle(Circle);Rectangle r=new Rectangle(Rectangle);pic.Add(r);pic.Draw();Line l=new Line(Line);r.Add(l);r.Remove(l);r.Draw();本讲稿第二十六页,共四十三页2727使用组合模式使用组合模式透明方式透明方式这这样样引引入入Composite模模式式后后,客客户户端端程程序序不不再再依依赖赖于于复复合合图图像像元元素素的的内内部部实实现现了了。然然而而,我我们们 程程 序序 中中 仍仍 然然 存存

20、 在在 着着 问问 题题,因因 为为 Line,Rectangle,Circle已已经经没没有有了了子子对对象象,它它是是一一个个基基本本图图像像元元素素,因因此此Add(),Remove()的的方方法法对对于于它它来来说说没没有有任任何何意意义义,而而且且把把这这种种错错误误不不会会在在编编译译的的时时候候报报错错,把把错错误误放放在在了了运运行行期期,我我们们希希望望能能够够捕捕获获到到这这类类错错误误,并并加加以处理。以处理。本讲稿第二十七页,共四十三页2828如此修改如此修改publicclassLine:GraphicspublicLine(stringname):base(name

21、)publicoverridevoidDraw()Console.WriteLine(Drawa+name.ToString();publicoverridevoidAdd(Graphicsg)/抛出一个我们自定义的异常抛出一个我们自定义的异常publicoverridevoidRemove(Graphicsg)/抛出一个我们自定义的异常抛出一个我们自定义的异常本讲稿第二十八页,共四十三页2929使用组合模式使用组合模式安全方式安全方式这这样样改改进进以以后后,我我们们可可以以捕捕获获可可能能出出现现的的错错误误,做做进进一一步步的的处处理理。上上面面的的这这种种实实现现方方法法属属于于透透明

22、明式式的的Composite模模式式,如如果果我我们们想想要要更更安安全全的的一一种种做做法法,就就需需要要把把管管理理子子对对象象的的方方法法声声明明在在树树枝枝构构件件Picture类类里里面面,这这样样如如果果叶叶子子节节点点Line,Rectangle,Circle使使用用这这些些方方法法时时,在在编编译译期期就就会会出出错。错。本讲稿第二十九页,共四十三页3030使用组合模式使用组合模式安全方式安全方式本讲稿第三十页,共四十三页3131示例代码示例代码namespace CompositPattern public abstract class Graphics protected

23、string name;public Graphics(string name)this.name=name;public abstract void Draw();本讲稿第三十一页,共四十三页3232示例代码示例代码using System;namespace CompositPattern public class Line:Graphics public Line(string name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();本讲稿第三十二页,共四十三页3333示例

24、代码示例代码using System;namespace CompositPattern public class Circle:Graphics public Circle(string name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();本讲稿第三十三页,共四十三页3434示例代码示例代码using System;namespace CompositPattern public class Rectangle:Graphics public Rectangle(strin

25、g name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();本讲稿第三十四页,共四十三页3535示例代码示例代码using System;using System.Collections;namespace CompositPattern public class Picture:Graphics protected ArrayList picList=new ArrayList();public Picture(string name):base(name)/public ov

26、erride void Draw()Console.WriteLine(Draw a +name.ToString();foreach(Graphics g in picList)g.Draw();public void Add(Graphics g)picList.Add(g);public void Remove(Graphics g)picList.Remove(g);本讲稿第三十五页,共四十三页3636示例代码示例代码using System;using System.Collections;namespace CompositPattern public class Picture:

27、Graphics protected ArrayList picList=new ArrayList();public Picture(string name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();foreach(Graphics g in picList)g.Draw();public void Add(Graphics g)picList.Add(g);public void Remove(Graphics g)picList.Remove(g);本讲稿第三十六页,共

28、四十三页3737示例代码示例代码using System;namespace CompositPattern public class Tester public static void Main()Picture pic=new Picture(Root);pic.Add(new Line(Line);pic.Add(new Circle(Circle);Rectangle r=new Rectangle(Rectangle);pic.Add(r);pic.Draw();r.Draw();本讲稿第三十七页,共四十三页3838使用组合模式使用组合模式安全方式安全方式这这种种方方式式属属于于安安

29、全全式式的的Composite模模式式,在在这这种种方方式式下下,虽虽然然避避免免了了前前面面所所讨讨论论的的错错误误,但但是是它它也也使使得得叶叶子子节节点点和和树树枝枝构构件件具具有有不不一一样样的的接接口口。这这种种方方式式和和透透明明式式的的Composite各各有有优优劣劣,具具体体使使用用哪哪一一个个,需需要要根根据据问问题题的实际情况而定。的实际情况而定。本讲稿第三十八页,共四十三页3939效果及实现要点效果及实现要点1.Composite模模式式采采用用树树形形结结构构来来实实现现普普遍遍存存在在的的对对象象容容器器,从从而而将将“一一对对多多”的的关关系系转转化化“一一对对一

30、一”的的关关系系,使使得得客客户户代代码码可可以以一一致致地地处处理理对对象象和和对对象象容容器器,无无需需关关心心处处理理的是单个的对象,还是组合的对象容器。的是单个的对象,还是组合的对象容器。本讲稿第三十九页,共四十三页4040效果及实现要点效果及实现要点2.将将“客客户户代代码码与与复复杂杂的的对对象象容容器器结结构构”解解耦耦是是Composite模模式式的的核核心心思思想想,解解耦耦之之后后,客客户户代代码码将将与与纯纯粹粹的的抽抽象象接接口口而而非非对对象象容容器器的的复复内内部部实实现现结结构构发发生生依依赖赖关关系系,从而更能从而更能“应对变化应对变化”。本讲稿第四十页,共四十

31、三页4141效果及实现要点效果及实现要点3.Composite模模式式中中,是是将将“Add和和Remove等等和和对对象象容容器器相相关关的的方方法法”定定义义在在“表表示示抽抽象象对对象象的的Component类类”中中,还还是是将将其其定定义义在在“表表示示对对象象容容器器的的Composite类类”中中,是是一一个个关关乎乎“透透明明性性”和和“安安全全性性”的的两两难难问问题题,需需要要仔仔细细权权衡衡。这这里里有有可可能能违违背背面面向向对对象象的的“单单一一职职责责原原则则”,但但是是对对于于这这种种特特殊殊结结构构,这这又又是必须付出的代价。是必须付出的代价。本讲稿第四十一页,

32、共四十三页4242效果及实现要点效果及实现要点4.Composite模模式式在在具具体体实实现现中中,可可以以让让父父对对象象中中的的子子对对象象反反向向追追溯溯;如如果果父父对对象象有有频频繁繁的的遍历需求,可使用缓存技巧来改善效率。遍历需求,可使用缓存技巧来改善效率。本讲稿第四十二页,共四十三页4343适用性适用性以下情况下适用以下情况下适用Composite模式:模式:你想表示对象的部分你想表示对象的部分-整体层次结构整体层次结构你希望用户忽略组合对象与单个对象的不同,用户将你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。统一地使用组合结构中的所有对象。本讲稿第四十三页,共四十三页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁