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

下载本文档

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

文档简介

第9章组合/合成模式(Composite)从前有个山,山里有个庙,庙里有个老和尚在给小和尚讲故事,讲的什么故事呢?从前有个山,山里有个庙……。奶奶的故事要循环多少次,根据你多长时间睡着而定。在故事中有山、有庙、有和尚、有故事从和尚的故事谈起从和尚的故事谈起组合模式组合模式定义将对象组合成树形结构以表示“整体-部分”的结构层次。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性应用组合模式来解决的思路引入一个抽象组件对象,作为组合对象和叶子对象的父对象用户使用时,不区分是在操作组合对象或是叶子对象,即对单个对象和组合对象的使用具有一致性组合模式UML类图

Component抽象组件对象为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现Leaf

叶子节点对象定义和实现叶子对象的行为,不再包含其它的子节点对象Composite组合对象通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义的与子组件有关的操作。Client

通过Component接口操纵组合部件的组件对象。组合模式分析组合模式的关键是定义一个抽象构件类。客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是组合,可以对其进行统一处理同时组合对象与抽象构件类之间还建立一个聚合关联关系,在组合对象中既可以包含叶子,也可以包含组合对象,以此实现递归组合,形成一个树形结构组合模式可以不提供父对象的管理方法,但组合模式必须在合适的地方提供子对象的管理方法(如:add、remove、getChild等)组合模式的实现根据所实现接口的区别分为两种形式:安全模式和透明模式组合模式类别透明组合模式UML在Component里面声明所有的用来管理子类对象的方法,包括add、remove,以及getChild。好处:所有的构件类都有相同的接口。客户端

可以等同的对待所有的对象。这就是透明形式的合成模式。缺点:不够安全,因为树叶类对象和合成类对

象在本质上是有区别的。

树叶类对象不可能有下一个层次的对象,因此add、remove以及getChild方法没有意义.在编译时期不会出错,而只会在运行时期才会出错。publicabstract

class

Component

{

//

Fields

protected

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

);

}publicclass

Leaf

extends

Component

{

//

Constructors

public

Leaf(

String

name

){super(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

);

}

}publicclass

Composite

extendsComponent{

private

ArrayList

children

=

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

children

)

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(

"Leaf

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类里面声明所有的用来管理子类对象的方法合成类和树叶类具有不同的实现。因为树叶类型的对象根本没有管理子类对象的方法,因此,如果客户端对树叶类对象使用这些方法时,程序会在编译时期出错缺点是不够透明,因为树叶类和合成类将具有不同的接口publicabstract

class

Component

{

//

Fields

protected

String

name;

//

Constructors

public

Component(

String

name

)

{

=

name;

}

public

abstract

void

Display(

int

depth

);

}publicclass

Leaf

extends

Component

{

//

Constructors

public

Leaf(

String

name

){super(name);}

//

Methods

public

void

Display(

int

depth

)

{

System.out.println(

name

);

}

}

publicclass

Composite

extendsComponent{

private

ArrayList

children

=

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

children)

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(

"Leaf

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

);

}

}两种实现方法的选择安全性合成模式是指:从客户端使用合成模式上看是否更安全,如果是安全的,那么就不会有发生误操作的可能,能访问的方法都是被支持的透明性合成模式是指:从客户端使用合成模式上,是否需要区分到底是“树枝对象”还是“树叶对象”。如果是透明的,那就不用区分,对于客户而言,都是Compoent对象,具体的类型对于客户端而言是透明的,是无须关心的。两种实现方法的选择对于合成模式而言,在安全性和透明性上,会更看重透明性,毕竟合成模式的目的是:让客户端不再区分操作的是树枝对象还是树叶对象,而是以一个统一的方式来操作JSP组合页面实例JSP组合页面实例Java中的应用JDK的AWT/Swing是组合模式在Java类库中的一个典型实际应用。Java

SE6对脚本语言的支持脚本语言又叫动态语言。是一种编程语言控制软件应用程序。脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。PHP、Python、JavaScript、Perl、Ruby均为脚本级语言

python是最出色的脚本语言,它可以很容易的内嵌某个软件中,作为那个软件的扩充,例如著名的3D设计软件blender使用内嵌的python脚本语言来设计复杂动画

对于初学者,python很适合于学习编程思想3)javax.script.SimpleBindingsSimpleBindings通过组合模式实现Map接口,它提供了两个构造函数。

无参构造函数在内部构造一个HashMap实例来实现Map接口要求的功能;以Map接口作为参数的构造函数,允许任何实现Map接口的类作为其组合的实例TomcatHttpServletRequest实现类中,组合了org.apache.catalina.Context的实现or

温馨提示

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

评论

0/150

提交评论