版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年新疆喀什第二中学高三上学期9月月考语文试题及答案
- 2024年广东省深圳市龙岗区中考英语二模试卷
- 上海市市辖区(2024年-2025年小学五年级语文)统编版专题练习((上下)学期)试卷及答案
- 上海市县(2024年-2025年小学五年级语文)人教版随堂测试((上下)学期)试卷及答案
- 郴州文物百咏作者:湖南省郴州市五岭大道陈友训
- 浙江省台州市台州十校2024-2025学年高一上学期11月期中联考数学试题含答案
- 2024届安徽省马鞍山市重点中学青浦高中高三下开学考数学试题
- 机电设备安装与调试技术教案
- 公立医院公益目标评估指标调查表
- 广东省广州市四校2024-2025学年九年级上学期11月期中化学试题(含答案)
- 教育学知到章节答案智慧树2023年宜宾学院
- 2023年大学试题(法学)-著作权法考试参考题库(含答案)
- 安全告知书完整版
- 小学英文绘本阅读课:小蝌蚪找妈妈
- 热工控制系统13
- 风险评估与审计计划模拟审计实训
- 绿博园站初步设计说明
- 武汉理工大学计算机网络试题及答案
- 山地光伏施工组织设计
- 六年级数学上册备课
- 汉字演变500例(中)
评论
0/150
提交评论