1.组合模式:是层次化的,将多个派生类组合到一个容器下
2.结构:将所有对象组织在一个树状结构下
3.用来实现对象之间的部分–整体之间的关系,把部分和整体放到同一个继承体系下,实现统一类型(接口)
4.组合模式使得用户对单个对象和组合对象的使用具有一致性。
5.类型:对象结构型模式
Component,抽象构件
接口或抽象类
叶子构件和容器构件共有方法的声明和实现放在抽象构件类中,这些方法包括访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。
客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。
Leaf,叶子构件
表示叶子节点对象。
实现了在抽象构件中定义的行为。
叶子构件不能再包含子构件,所以在叶子构件中实现子构件管理和访问方法时需要提供异常处理或错误提示。
Composite,容器构件
表示容器节点对象。
容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点。
它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法。
由于容器构件中仍然可以包含容器构件,因此在对容器构件进行处理时需要使用递归算法。
组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。同时容器对象与抽象构件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构。
package 组合模式;
import java.util.ArrayList;
public class ComponentPattern {
public static void main(String[] args) {
Component leaf = new Leaf();
leaf.add(leaf);
leaf.operation();
Component composite = new Composite();
composite.add(leaf);
composite.operation();
}
}
interface Component{
void add(Component c);
void remove(Component c);
Component getChild(int i);
void operation();//业务方法
}
class Leaf implements Component{
public void add(Component c) {
// 异常处理或错误提示
System.out.println("ERROR:叶子节点不存在此操作");
}
public void remove(Component c) {
// 异常处理或错误提示
System.out.println("ERROR:叶子节点不存在此操作");
}
public Component getChild(int i) {
// 异常处理或错误提示
System.out.println("ERROR:叶子节点不存在此操作");
return null;
}
public void operation() {
System.out.println("Leaf.operation()");
}
}
class Composite implements Component{
private ArrayList<Component> list = new ArrayList<Component>();
public void add(Component c) {
list.add(c);
}
public void remove(Component c) {
list.remove(c);
}
public Component getChild(int i) {
return (Component) list.get(i);
}
public void operation() {
// 容器构件具体业务方法的实现
// 递归调用成员构件的业务方法
for (Object obj : list) {
((Component) obj).operation();
}
}
/*
实现具体业务方法时,由于容器构件充当的是容器角色,包含成员构件,
因此它将调用其成员构件的业务方法。在组合模式结构中,
由于容器构件中仍然可以包含容器构件,因此在对容器构件进行处理时需要使用递归算法
*/
}
/*
优点:
使用方便。客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构。
符合“开闭原则”。在组合模式中新增叶子构件和容器构件都很方便。
*/
缺点:
/*1、组合模式中安全性和透明性只能选其一,安全性指在Component接口中只声明叶子节点和非叶子节点共有特性,透明性指在Component中声明了非叶子节点属性。2、设计较复杂,客户端需要花更多时间理清类之间的层次关系;*/