Java 设计模式-组合模式
2016-04-18 16:02
671 查看
组合模式使用面向对象的思想来实现树形结构的构建与处理,描述了如何将容器对象和叶子对象进行递归组合,实现简单,灵活性好。由于在软件开发中存在大量的树形结构,因此组合模式是一种使用频率较高的结构型设计模式,Java SE 中的 AWT 和 Swing 包的设计就基于组合模式,在这些界面包中为用户提供了大量的容器构件(如 Container)和成员构件(如 Chec
4000
kbox、Button 和 TextComponent等),其结构如图所示:
在图中,Component 类是抽象构件,Checkbox、Button 和 TextComponent 是叶子构件,而Container 是容器构件,在一个容器构件中可以包含叶子构件,也可以继续包含容器构件,这些叶子构件和容器构件一起组成了复杂的 GUI 界面。 除此以外,在 XML 解析、组织结构树处理、文件系统设计等领域,组合模式都得到了广泛应用。
UML 图如下:
Leaf : 表示叶节点对象。叶子节点没有子节点。
Composite : 定义枝节点行为,用来存储子部件,在 Component 接口中实现与子部件相关的操作。例如 Add 和 Remove。
Client : 通过 Component 接口操作结构中的对象。
(1) 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
(2) 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
(3) 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
(4) 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。
4000
kbox、Button 和 TextComponent等),其结构如图所示:
在图中,Component 类是抽象构件,Checkbox、Button 和 TextComponent 是叶子构件,而Container 是容器构件,在一个容器构件中可以包含叶子构件,也可以继续包含容器构件,这些叶子构件和容器构件一起组成了复杂的 GUI 界面。 除此以外,在 XML 解析、组织结构树处理、文件系统设计等领域,组合模式都得到了广泛应用。
UML 图如下:
源代码 :
Component : 组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理 Component 的子部件。public interface Component { public void add(Component component); public void display(); public void remove(Component component); }
Leaf : 表示叶节点对象。叶子节点没有子节点。
public class Leaf implements Component { private String name; public Leaf(String name) { this.name = name; } @Override public void add(Component component) { } @Override public void display() { System.out.println("leaf name:" + this.name); } @Override public void remove(Component component) { } }
Composite : 定义枝节点行为,用来存储子部件,在 Component 接口中实现与子部件相关的操作。例如 Add 和 Remove。
public class Composite implements Component { private String name; private List<Component> componentList = new ArrayList<Component>(); public Composite(String name) { this.name = name; } @Override public void add(Component component) { componentList.add(component); } @Override public void display() { for (Component component : componentList) { component.display(); } } @Override public void remove(Component component) { componentList.remove(component); } }
Client : 通过 Component 接口操作结构中的对象。
public class Client { public static void main(String[] args) { Component com1=new Composite("root"); com1.add(new Leaf("A")); com1.add(new Leaf("B")); Component com2=new Composite("trunk"); com2.add(new Leaf(("C"))); com2.add(com1); com2.display(); } }
主要优点
组合模式的主要优点如下:(1) 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
(2) 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
(3) 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
(4) 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
主要缺点
组合模式的主要缺点如下:在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。
相关文章推荐
- 初学java
- 解决Java J2EE乱码问题的方法
- JAVA多线程--基本特性
- Java并发编程(一) 两种实现多线程的方法(Thread,Runnable)
- Java FTPClient实现文件上传下载
- eclipse 配置 maven 编译代码
- Spring中事务的问题
- (13)处理静态资源(自定义资源映射)【从零开始学Spring Boot】
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
- Java并发编程系列文章目录帖及源码
- java多线程核心技术梳理(附源码)
- 【protected权限】java浅复制、深复制中,为什么在派生类中覆盖基类的clone()方法,并声明为public
- java实现FTP文件上传与文件下载
- Java---16---多线程---死锁
- JAVA多线程计算ExecutorService
- Java-控制流语句
- java处理JSON格式数据的通用类-分享
- Java加密解密快速入门上篇【包括MD5、BASE64、DES、RSA等算法】
- eclipse再见,android studio 新手入门教程(二)项目的导入
- struts1.0 dispatchAction、全局跳转、动态表单