《11 C#设计模式-组合模式.ppt》由会员分享,可在线阅读,更多相关《11 C#设计模式-组合模式.ppt(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、www.ChinaSA.infoDDesign esign P Patternsatterns组合模式组合模式组合模式组合模式刘刘 伟伟(Sunny)weiliu_www.ChinaSA.info大纲w组合模式概述w组合模式的结构与实现w组合模式的应用实例w透明组合模式与安全组合模式w组合模式的优缺点与适用环境www.ChinaSA.info组合模式概述wWindows操作系统目录结构www.ChinaSA.info组合模式概述w分析在树形目录结构中,包含在树形目录结构中,包含文件和文件夹文件和文件夹两类不同的元两类不同的元素素在文件夹中可以包含文件,还可以继续包含子文件夹在文件中不能再包含子
2、文件或者子文件夹文件夹文件夹 容器容器(Container)文件文件 叶子叶子(Leaf)www.ChinaSA.info组合模式概述w分析当容器对象的某一个方法被调用时,将遍历整个树形当容器对象的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象并调用执行,结构,寻找也包含这个方法的成员对象并调用执行,牵一而动百,其中牵一而动百,其中使用了递归调用的机制使用了递归调用的机制来对整个结来对整个结构进行处理构进行处理由于容器对象和叶子对象在功能上的区别,由于容器对象和叶子对象在功能上的区别,在使用这在使用这些对象的代码中必须有区别地对待容器对象和叶子对些对象的代码中必须有区别地
3、对待容器对象和叶子对象象,而实际上大多数情况下客户端,而实际上大多数情况下客户端希望一致地处理它希望一致地处理它们们,因为对于这些对象的区别对待将会使程序非常复,因为对于这些对象的区别对待将会使程序非常复杂杂if(is 容器容器对对象象)/处处理容器理容器对对象象else if(is 叶子叶子对对象象)/处处理叶子理叶子对对象象www.ChinaSA.info组合模式概述w如何一致地对待容器对象和叶子对象?组合模式组合模式组合模式通过一种巧妙的设计方案使得用户可以一致性组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,它描述了地处理整个树形结构或者树形结构
4、的一部分,它描述了如何将容器对象和叶子对象进行递归组合,使得用户在如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对它们进行区分,可以一致地对待容器对象使用时无须对它们进行区分,可以一致地对待容器对象和叶子对象。和叶子对象。www.ChinaSA.info组合模式概述w组合模式定义对象结构型对象结构型模式模式组组合合模模式式:组合多个对象形成树树形形结结构构以表示具具有有部部分分-整整体体关关系系的的层层次次结结构构。组合模式让客户端可以统统一一对待单个对象和组合对象。Composite Pattern:Compose objects into tree structures to
5、represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.www.ChinaSA.info组合模式概述w组合模式定义又称为又称为“部分部分-整体整体”(Part-Whole)模模式式将对象组织到将对象组织到树形结构树形结构中,可以用来描中,可以用来描述整体与部分的关系述整体与部分的关系www.ChinaSA.info组合模式的结构与实现w组合模式的结构www.ChinaSA.info组合模式的结构与实现w组合模式的结
6、构组合模式包含以下组合模式包含以下3个角色:个角色:Component(抽象构件)Leaf(叶子构件)Composite(容器构件)www.ChinaSA.info组合模式的结构与实现w组合模式的实现抽象构件角色典型代码:抽象构件角色典型代码:abstract class Componentpublic abstract void Add(Component c);/增加成员public abstract void Remove(Component c);/删除成员public abstract Component GetChild(int i);/获取成员public abstract vo
7、id Operation();/业务方法www.ChinaSA.info组合模式的结构与实现w组合模式的实现叶子构件角色典型代码:叶子构件角色典型代码:class Leaf:Componentpublic override void Add(Component c)/异常异常处处理或理或错误错误提示提示 public override void Remove(Component c)/异常异常处处理或理或错误错误提示提示 public override Component GetChild(int i)/异常异常处处理或理或错误错误提示提示return null;public override
8、 void Operation()/叶子构件具体业务方法的实现 www.ChinaSA.info组合模式的结构与实现w组合模式的实现容器构件角色典型代码:容器构件角色典型代码:using System;using System.Collections.Generic;class Composite:Component private List list=new List();public override void Add(Component c)list.Add(c);public override void Remove(Component c)list.Remove(c);public
9、override Component GetChild(int i)return(Component)listi;public override void Operation()/容器构件具体容器构件具体业务业务方法的方法的实现实现,将,将递归调递归调用成用成员员构件的构件的业务业务方法方法foreach(Object obj in list)(Component)obj).Operation();www.ChinaSA.info组合模式的应用实例w实例说明某软件公司要开发一个杀毒(Antivirus)软件,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀
10、毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile)和文本文件(TextFile)的杀毒方式就有所差异。现使用组合模式来设计该杀毒软件的整体框架。www.ChinaSA.info组合模式的应用实例w实例类图杀毒软件框架设计结构图杀毒软件框架设计结构图www.ChinaSA.info组合模式的应用实例w实例代码(1)AbstractFile:抽象文件类,充当抽象构件类:抽象文件类,充当抽象构件类(2)ImageFile:图像文件类,充当叶子构件类:图像文件类,充当叶子构件类(3)TextFile:文本文件类,充当叶子构件类:文本文件类,充
11、当叶子构件类(4)VideoFile:视频文件类,充当叶子构件类:视频文件类,充当叶子构件类(5)Folder:文件夹类,充当容器构件类:文件夹类,充当容器构件类(6)Program:客户端测试类:客户端测试类演示演示演示演示参考代码参考代码(DesignPatternCompositeSample)www.ChinaSA.info组合模式的应用实例w结果及分析如果需要更换操作节点,例如只对文件夹如果需要更换操作节点,例如只对文件夹“文本文件文本文件”进行杀毒,进行杀毒,客户端代码客户端代码只需修改一行即可只需修改一行即可,将代码:,将代码:改为:改为:在具体实现时,可以在具体实现时,可以创建
12、图形化界面让用户来选择所需操作的根创建图形化界面让用户来选择所需操作的根节点节点,无须修改源代码,符合开闭原则,无须修改源代码,符合开闭原则folder1.KillVirus();folder3.KillVirus();www.ChinaSA.info透明组合模式与安全组合模式w透明组合模式抽象构件抽象构件Component中中声明了所有用于管理成员对象声明了所有用于管理成员对象的方法,包括的方法,包括Add()、Remove(),以及,以及GetChild()等方法等方法在客户端看来,叶子对象与容器对象所提供的方法是在客户端看来,叶子对象与容器对象所提供的方法是一致的,一致的,客户端可以一致
13、地对待所有的对象客户端可以一致地对待所有的对象缺点是缺点是不够安全不够安全,因为叶子对象和容器对象在本质上,因为叶子对象和容器对象在本质上是有区别的是有区别的www.ChinaSA.info透明组合模式与安全组合模式w安全组合模式抽象构件抽象构件Component中中没有声明任何用于管理成员对没有声明任何用于管理成员对象的方法,而是在象的方法,而是在Composite类中声明并实现这些方类中声明并实现这些方法法对于叶子对象对于叶子对象,客户端不可能调用到这些方法客户端不可能调用到这些方法缺点是缺点是不够透明不够透明,客户端不能完全针对抽象编程,必客户端不能完全针对抽象编程,必须有区别地对待叶子
14、构件和容器构件须有区别地对待叶子构件和容器构件www.ChinaSA.info组合模式的优缺点与适用环境w模式优点可以清楚地可以清楚地定义分层次的复杂对象定义分层次的复杂对象,表示对,表示对象的全部或部分层次,象的全部或部分层次,让客户端忽略了层次让客户端忽略了层次的差异的差异,方便对整个层次结构进行控制,方便对整个层次结构进行控制客户端可以客户端可以一致地使用一个组合结构或其中一致地使用一个组合结构或其中单个对象单个对象,不必关心处理的是单个对象还是,不必关心处理的是单个对象还是整个组合结构,整个组合结构,简化了客户端代码简化了客户端代码增加新的容器构件和叶子构件都很方便增加新的容器构件和叶
15、子构件都很方便,符,符合开闭原则合开闭原则为为树形结构的面向对象实现树形结构的面向对象实现提供了一种灵活提供了一种灵活的解决方案的解决方案www.ChinaSA.info组合模式的优缺点与适用环境w模式缺点在增加新构件时在增加新构件时很难对容器中的构件类很难对容器中的构件类型进行限制型进行限制www.ChinaSA.info组合模式的优缺点与适用环境w模式适用环境在在具有整体和部分的层次结构具有整体和部分的层次结构中,希望中,希望通过一种方式忽略整体与部分的差异,通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们客户端可以一致地对待它们在一个使用在一个使用面向对象语言开发的系统面向对象语言开发的系统中中需要处理一个需要处理一个树形结构树形结构在一个系统中在一个系统中能够分离出叶子对象和容能够分离出叶子对象和容器对象器对象,而且它们的类型不固定,而且它们的类型不固定,需要需要增加一些新的类型增加一些新的类型www.ChinaSA.info思考w在组合模式的结构图中,如果聚合关联关系不是从Composite到Component的,而是从Composite到Leaf,如下图所示,会产生怎样的结果?www.ChinaSA.infoENDEND
限制150内