结构型模式组合模式优秀课件.ppt

上传人:石*** 文档编号:49558771 上传时间:2022-10-09 格式:PPT 页数:43 大小:2.52MB
返回 下载 相关 举报
结构型模式组合模式优秀课件.ppt_第1页
第1页 / 共43页
结构型模式组合模式优秀课件.ppt_第2页
第2页 / 共43页
点击查看更多>>
资源描述

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

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

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

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

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

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

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

7、43页12第一次尝试第一次尝试namespace NoPattern public abstract class Graphics protected string name;public Graphics(string name)this.name=name;public abstract void Draw();第12页,本讲稿共43页13第一次尝试第一次尝试using System;namespace NoPattern public class Line:Graphics public Line(string name):base(name)/public override void

8、Draw()Console.WriteLine(Draw a+name.ToString();第13页,本讲稿共43页14第一次尝试第一次尝试using System;namespace NoPattern public class Circle:Graphics public Circle(string name):base(name)/public override void Draw()Console.WriteLine(Draw a+name.ToString();第14页,本讲稿共43页15第一次尝试第一次尝试using System;namespace NoPattern publ

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

10、ide void Draw()/public ArrayList GetChild()/第16页,本讲稿共43页17存在的问题存在的问题现在我们要对该图像元素进行处理:在客户端现在我们要对该图像元素进行处理:在客户端程序中,需要判断返回对象的具体类型到底是程序中,需要判断返回对象的具体类型到底是基本图像元素,还是复合图像元素。如果是复基本图像元素,还是复合图像元素。如果是复合图像元素,我们将要用递归去处理,然而这合图像元素,我们将要用递归去处理,然而这种处理的结果却增加了客户端程序与复杂图像种处理的结果却增加了客户端程序与复杂图像元素内部结构之间的依赖,那么我们如何去解元素内部结构之间的依赖,

11、那么我们如何去解耦这种关系呢?耦这种关系呢?第17页,本讲稿共43页18使用组合模式使用组合模式透明方式透明方式我们希望的是客户程序可以像处理基本图像元我们希望的是客户程序可以像处理基本图像元素一样来处理复合图像元素,这就要引入素一样来处理复合图像元素,这就要引入Composite模式了,需要把对于子对象的管模式了,需要把对于子对象的管理工作交给复合图像元素,为了进行子对象理工作交给复合图像元素,为了进行子对象的管理,它必须提供必要的的管理,它必须提供必要的Add(),Remove()等方法。等方法。第18页,本讲稿共43页19使用组合模式使用组合模式透明方式透明方式第19页,本讲稿共43页2

12、0示例代码示例代码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);第20页,本讲稿共43页21示例代码示例代码using System;namespace CompositPattern pub

13、lic 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)/第21页,本讲稿共43页22示例代码示例代码using System;namespace CompositPattern public class Circle:Graphics publ

14、ic 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)/第22页,本讲稿共43页23示例代码示例代码using System;namespace CompositPattern public class Rectangle:Graphics public Rectangle(string nam

15、e):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();public override void Add(Graphics g)/public override void Remove(Graphics g)/第23页,本讲稿共43页24示例代码示例代码using System;using System.Collections;namespace CompositPattern public class Picture:Graphics protected ArrayList picL

16、ist=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 override void Remove(Graphics g)picList.Remove(g);第24页,本讲稿共43页25示例代码示例代码usi

17、ng 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 +name.ToString();foreach(Graphics g in picList)g.Draw();public override vo

18、id Add(Graphics g)picList.Add(g);public override void Remove(Graphics g)picList.Remove(g);第25页,本讲稿共43页26示例代码示例代码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 Rectangl

19、e(Rectangle);pic.Add(r);pic.Draw();Line l=new Line(Line);r.Add(l);r.Remove(l);r.Draw();第26页,本讲稿共43页27使用组合模式使用组合模式透明方式透明方式这这样样引引入入Composite模模式式后后,客客户户端端程程序序不不再再依依赖赖于于复复合合图图像像元元素素的的内内部部实实现现了了。然然而而,我我们们 程程 序序 中中 仍仍 然然 存存 在在 着着 问问 题题,因因 为为 Line,Rectangle,Circle已已经经没没有有了了子子对对象象,它它是是一一个个基基本本图图像像元元素素,因因此此A

20、dd(),Remove()的的方方法法对对于于它它来来说说没没有有任任何何意意义义,而而且且把把这这种种错错误误不不会会在在编编译译的的时时候候报报错错,把把错错误误放放在在了了运运行行期期,我我们们希希望望能能够够捕捕获获到到这这类类错错误误,并并加加以处理。以处理。第27页,本讲稿共43页28如此修改如此修改publicclassLine:GraphicspublicLine(stringname):base(name)publicoverridevoidDraw()Console.WriteLine(Drawa+name.ToString();publicoverridevoidAdd(

21、Graphicsg)/抛出一个我们自定义的异常抛出一个我们自定义的异常publicoverridevoidRemove(Graphicsg)/抛出一个我们自定义的异常抛出一个我们自定义的异常第28页,本讲稿共43页29使用组合模式使用组合模式安全方式安全方式这这样样改改进进以以后后,我我们们可可以以捕捕获获可可能能出出现现的的错错误误,做做进进一一步步的的处处理理。上上面面的的这这种种实实现现方方法法属属于于透透明明式式的的Composite模模式式,如如果果我我们们想想要要更更安安全全的的一一种种做做法法,就就需需要要把把管管理理子子对对象象的的方方法法声声明明在在树树枝枝构构件件Pictu

22、re类类里里面面,这这 样样 如如 果果 叶叶 子子 节节 点点Line,Rectangle,Circle使使用用这这些些方方法法时时,在在编编译译期期就就会会出出错。错。第29页,本讲稿共43页30使用组合模式使用组合模式安全方式安全方式第30页,本讲稿共43页31示例代码示例代码namespace CompositPattern public abstract class Graphics protected string name;public Graphics(string name)this.name=name;public abstract void Draw();第31页,本讲稿

23、共43页32示例代码示例代码using System;namespace CompositPattern public class Line:Graphics public Line(string name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();第32页,本讲稿共43页33示例代码示例代码using System;namespace CompositPattern public class Circle:Graphics public Circle(string name

24、):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();第33页,本讲稿共43页34示例代码示例代码using System;namespace CompositPattern public class Rectangle:Graphics public Rectangle(string name):base(name)/public override void Draw()Console.WriteLine(Draw a +name.ToString();第34页,本讲稿共43页35示

25、例代码示例代码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 +name.ToString();foreach(Graphics g in picList)g.Draw();public v

26、oid Add(Graphics g)picList.Add(g);public void Remove(Graphics g)picList.Remove(g);第35页,本讲稿共43页36示例代码示例代码using System;using System.Collections;namespace CompositPattern public class Picture:Graphics protected ArrayList picList=new ArrayList();public Picture(string name):base(name)/public override voi

27、d 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);第36页,本讲稿共43页37示例代码示例代码using System;namespace CompositPattern public class Tester public static void Main()Picture pic=new

28、 Picture(Root);pic.Add(new Line(Line);pic.Add(new Circle(Circle);Rectangle r=new Rectangle(Rectangle);pic.Add(r);pic.Draw();r.Draw();第37页,本讲稿共43页38使用组合模式使用组合模式安全方式安全方式这这种种方方式式属属于于安安全全式式的的Composite模模式式,在在这这种种方方式式下下,虽虽然然避避免免了了前前面面所所讨讨论论的的错错误误,但但是是它它也也使使得得叶叶子子节节点点和和树树枝枝构构件件具具有有不不一一样样的的接接口口。这这种种方方式式和和透透

29、明明式式的的Composite各各有有优优劣劣,具具体体使使用用哪哪一一个个,需需要要根根据据问问题题的的实际情况而定。实际情况而定。第38页,本讲稿共43页39效果及实现要点效果及实现要点1.Composite模模式式采采用用树树形形结结构构来来实实现现普普遍遍存存在在的的对对象象容容器器,从从而而将将“一一对对多多”的的关关系系转转化化“一一对对一一”的的关关系系,使使得得客客户户代代码码可可以以一一致致地地处处理理对对象象和和对对象象容容器器,无无需需关关心心处处理理的的是是单单个个的的对对象象,还还是是组组合的对象容器。合的对象容器。第39页,本讲稿共43页40效果及实现要点效果及实现

30、要点2.将将“客客户户代代码码与与复复杂杂的的对对象象容容器器结结构构”解解耦耦是是Composite模模式式的的核核心心思思想想,解解耦耦之之后后,客客户户代代码码将将与与纯纯粹粹的的抽抽象象接接口口而而非非对对象象容容器器的的复复内内部部实实现现结结构构发发生生依依赖赖关关系系,从而更能从而更能“应对变化应对变化”。第40页,本讲稿共43页41效果及实现要点效果及实现要点3.Composite模模式式中中,是是将将“Add和和Remove等等和和对对象象容容器器相相关关的的方方法法”定定义义在在“表表示示抽抽象象对对象象的的Component类类”中中,还还是是将将其其定定义义在在“表表示

31、示对对象象容容器器的的Composite类类”中中,是是一一个个关关乎乎“透透明明性性”和和“安安全全性性”的的两两难难问问题题,需需要要仔仔细细权权衡衡。这这里里有有可可能能违违背背面面向向对对象象的的“单单一一职职责责原原则则”,但但是是对对于于这这种种特特殊殊结结构构,这这又又是必须付出的代价。是必须付出的代价。第41页,本讲稿共43页42效果及实现要点效果及实现要点4.Composite模模式式在在具具体体实实现现中中,可可以以让让父父对对象象中中的的子子对对象象反反向向追追溯溯;如如果果父父对对象象有有频频繁繁的的遍遍历历需需求求,可可使使用用缓缓存存技技巧巧来来改改善善效率。效率。第42页,本讲稿共43页43适用性适用性以下情况下适用以下情况下适用Composite模式:模式:你想表示对象的部分你想表示对象的部分-整体层次结构整体层次结构你希望用户忽略组合对象与单个对象的不同,用你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。户将统一地使用组合结构中的所有对象。第43页,本讲稿共43页

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

当前位置:首页 > 生活休闲 > 资格考试

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

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