第9章 组合模式_第1页
第9章 组合模式_第2页
第9章 组合模式_第3页
第9章 组合模式_第4页
第9章 组合模式_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第9章章 组合组合/合成模式合成模式(Composite)从前有个山,山里有个庙,庙里有个老和尚在给小和尚从前有个山,山里有个庙,庙里有个老和尚在给小和尚讲故事,讲的什么故事呢?从前有个山,山里有个讲故事,讲的什么故事呢?从前有个山,山里有个庙庙。奶奶的故事要循环多少次,根据你多长时间睡。奶奶的故事要循环多少次,根据你多长时间睡着而定。在故事中有山、有庙、有和尚、有故事着而定。在故事中有山、有庙、有和尚、有故事从和尚的故事谈起从和尚的故事谈起从和尚的故事谈起从和尚的故事谈起组合模式组合模式组合模式定义组合模式定义将对象组合成将对象组合成树形结构树形结构以表示以表示“整体整体-部部分分”的结构

2、层次。组合模式对的结构层次。组合模式对单个对象单个对象(即叶子对象)(即叶子对象)和和组合对象(即容器对象)组合对象(即容器对象)的的使用具有一致性使用具有一致性应用组合模式来解决的思路应用组合模式来解决的思路 引入一个抽象组件对象,作为组合对象和叶子对引入一个抽象组件对象,作为组合对象和叶子对象的父对象象的父对象 用户使用时,不区分是在操作组合对象或是叶子用户使用时,不区分是在操作组合对象或是叶子对象,即对单个对象和组合对象的使用具有一致对象,即对单个对象和组合对象的使用具有一致性性组合模式组合模式UML类图类图 Component抽象组件对象抽象组件对象为组合中的对象声明接口,让客户端可以

3、通过为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现在里面为定义的功能提供缺省的实现 Leaf 叶子叶子节点对象节点对象定义和实现叶子对象的行为,不再包含其它的定义和实现叶子对象的行为,不再包含其它的子节点对象子节点对象 Composite组合对象组合对象通常会存储子组件,定义包含子组件的那些组通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义的与子件的行为,并实现在组件接口中定义的与子组件有关的操作组件有关的操作。 Client 通过通过Component接口操纵组合部件

4、的组件对象。接口操纵组合部件的组件对象。组合模式分析组合模式分析组合模式的关键是定义一个抽象构件类。客户端组合模式的关键是定义一个抽象构件类。客户端针对该抽象构件类进行编程,无须知道它到底表针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是示的是叶子还是组合组合,可以对其进行统一处理,可以对其进行统一处理同时同时组合组合对象与抽象构件类之间还建立一个聚合对象与抽象构件类之间还建立一个聚合关联关系,在关联关系,在组合组合对象中既可以包含叶子,也可对象中既可以包含叶子,也可以包含以包含组合组合对象,以此实现递归组合,形成一个对象,以此实现递归组合,形成一个树形结构树形结构 组合模式可以不提供

5、组合模式可以不提供父对象父对象的管理方法,但的管理方法,但组合模式必须在合适的地方提供组合模式必须在合适的地方提供子对象子对象的管的管理方法(如:理方法(如:add、remove、getChild等)等) 组合模式的实现根据所实现接口的区别分为组合模式的实现根据所实现接口的区别分为两种形式两种形式: 安全模式和透明模式安全模式和透明模式组合模式类别组合模式类别透明组合模式透明组合模式UML 在在Component里面声明所有的用来管理子类对象的里面声明所有的用来管理子类对象的方法,包括方法,包括add、remove,以及,以及getChild。好处好处: 所有的构件类都有相同的接口。客户端所有

6、的构件类都有相同的接口。客户端 可以等同可以等同的对待所有的对象。这就是的对待所有的对象。这就是透明形式透明形式的合成模式。的合成模式。缺点缺点: 不够安全不够安全,因为树叶类对象和合成类对,因为树叶类对象和合成类对 象在本质象在本质上是有区别的。上是有区别的。 树叶类对象不可能有下一个层次的对象,因此树叶类对象不可能有下一个层次的对象,因此add、remove以及以及getChild方法没有意义方法没有意义. 在编译时期不在编译时期不会出错,而只会在运行时期才会出错会出错,而只会在运行时期才会出错。public abstract class Component / Fields protec

7、ted String name; / Constructors public Component( String name ) = name; / Methods public abstract void Add(Component c); public abstract void Remove( Component c ); public abstract void Display( int depth );public class Leaf extends Component / Constructors public Leaf( String name ) super

8、(name); / Methods public void Add( Component c ) System.out.println(Cannot add to a leaf); public void Remove( Component c ) System.out.println(Cannot remove from a leaf); public void Display( int depth ) System.out.println( name ); public class Composite extends Component private ArrayList children

9、 = new ArrayList(); public Composite( string name ) super(name); public void Add( Component component ) children.Add( component ); public void Remove( Component component ) children.Remove( component ); public void Display( int depth ) System.out.println( name ); foreach( Component component in chil

10、dren ) component.Display( depth + 2 ); public class Client public static void main( String args ) Composite root = new Composite( root ); root.Add( new Leaf( Leaf A ); root.Add( new Leaf( Leaf B ); Composite comp = new Composite( Composite X ); comp.Add( new Leaf( Leaf XA ) ); comp.Add( new Leaf( Le

11、af XB ) ); root.Add( comp ); root.Add( new Leaf( Leaf C ); Leaf l = new Leaf( Leaf D ); root.Add( l ); root.Remove( l ); root.Display( 1 ); 安全组合模式安全组合模式UML在在Composite类里面声明所有的用来管理子类对象类里面声明所有的用来管理子类对象的方法的方法合成类和树叶类具有不同的实现合成类和树叶类具有不同的实现。因为树叶类型。因为树叶类型的对象根本没有管理子类对象的方法,因此,如果的对象根本没有管理子类对象的方法,因此,如果客户端对树叶类对象使

12、用这些方法时,程序会在编客户端对树叶类对象使用这些方法时,程序会在编译时期出错译时期出错缺点缺点是不够透明,因为树叶类和合成类将具有不是不够透明,因为树叶类和合成类将具有不同的接口同的接口public abstract class Component / Fields protected String name; / Constructors public Component( String name ) = name; public abstract void Display( int depth );public class Leaf extends Component

13、 / Constructors public Leaf( String name ) super(name); / Methods public void Display( int depth ) System.out.println( name ); public class Composite extends Component private ArrayList children = new ArrayList(); public Composite( string name ) super(name); public void Add( Component component ) ch

14、ildren.Add( component ); public void Remove( Component component ) children.Remove( component ); public void Display( int depth ) System.out.println( name ); foreach(Component component in children) component.Display( depth + 2 ); public class Client public static void main( String args ) Composite

15、root = new Composite( root ); root.Add( new Leaf( Leaf A ); root.Add( new Leaf( Leaf B ); Composite comp = new Composite( Composite X ); comp.Add( new Leaf( Leaf XA ) ); comp.Add( new Leaf( Leaf XB ) ); root.Add( comp ); root.Add( new Leaf( Leaf C ); Leaf l = new Leaf( Leaf D ); root.Add( l ); root.

16、Remove( l ); root.Display( 1 ); 两种实现方法的选择两种实现方法的选择安全性合成模式是指安全性合成模式是指:从客户端使用合成模式上看:从客户端使用合成模式上看是否更安全,如果是安全的,那么就不会有发生误是否更安全,如果是安全的,那么就不会有发生误操作的可能,能访问的方法都是被支持的操作的可能,能访问的方法都是被支持的透明性合成模式是指透明性合成模式是指:从客户端使用合成模式上,:从客户端使用合成模式上,是否需要区分到底是是否需要区分到底是“树枝对象树枝对象”还是还是“树叶对树叶对象象”。如果是透明的,那就不用区分,对于客户而。如果是透明的,那就不用区分,对于客户而

17、言,都是言,都是Compoent对象,具体的类型对于客户端而对象,具体的类型对于客户端而言是透明的,是无须关心的。言是透明的,是无须关心的。两种实现方法的选择两种实现方法的选择对于合成模式而言,在安全性和透明性上,会更看对于合成模式而言,在安全性和透明性上,会更看重重透明性透明性,毕竟合成模式的目的是:让客户端不再,毕竟合成模式的目的是:让客户端不再区分操作的是树枝对象还是树叶对象,而是以一个区分操作的是树枝对象还是树叶对象,而是以一个统一的方式来操作统一的方式来操作JSP组合页面实例组合页面实例JSP组合页面实例组合页面实例Java中的应用中的应用JDK的的AWT/Swing是组合模式在是组

18、合模式在Java类库中的一个典型实类库中的一个典型实际应用。际应用。componentComponentButtonContainer- component : ComponentTextComponentCheckboxJava SE 6 对脚本语言的支持对脚本语言的支持脚本语言又叫动态语言。是一种编程语言控制软件应用程脚本语言又叫动态语言。是一种编程语言控制软件应用程序。脚本通常以文本序。脚本通常以文本(如如ASCII)保存,只在被调用时进行解保存,只在被调用时进行解释或编译。释或编译。PHP、Python、JavaScript、Perl、Ruby均为脚本级语言均为脚本级语言 python

19、是最出色的脚本语言,它可以很容易的内嵌某个软是最出色的脚本语言,它可以很容易的内嵌某个软件中,作为那个软件的扩充,例如著名的件中,作为那个软件的扩充,例如著名的3D设计软件设计软件blender使用内嵌的使用内嵌的python脚本语言来设计复杂动画脚本语言来设计复杂动画 对于初学者,对于初学者,python很适合于学习编程思想很适合于学习编程思想3) javax.script.SimpleBindings SimpleBindings通过通过组合模式组合模式实现实现 Map 接口,它提供了两接口,它提供了两个构造函数。个构造函数。 无参构造函数在内部构造一个无参构造函数在内部构造一个 Hash

20、Map 实例来实现实例来实现 Map 接口要求的功能;以接口要求的功能;以 Map 接口作为参数的构造函数,允许接口作为参数的构造函数,允许任何实现任何实现 Map 接口的类作为其组合的实例接口的类作为其组合的实例Tomcat HttpServletRequest实现类中,组合了实现类中,组合了 org.apache.catalina.Context的实现的实现 org.apache.catalina.core.StandardContext组合模式优点组合模式优点可以清楚地定义可以清楚地定义分层次的复杂对象分层次的复杂对象,表示,表示对象的全部或部分层次,使得增加新构件对象的全部或部分层次,

21、使得增加新构件也更容易。也更容易。客户端调用简单,客户端调用简单,客户端可以一致的使用客户端可以一致的使用组合结构或其中单个对象组合结构或其中单个对象。组合模式优点组合模式优点定义了包含叶子对象和容器对象的定义了包含叶子对象和容器对象的类层次结类层次结构构,叶子对象可以被组合成更复杂的容器对,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不象,而这个容器对象又可以被组合,这样不断递归下去,断递归下去,可以形成复杂的树形结构可以形成复杂的树形结构。更容易在组合体内加入对象构件更容易在组合体内加入对象构件,客户端不,客户端不必因为加入了新的对象构件而更改原有代码。必因为加入了新

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论