定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.
Composite比较容易理解,想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。
所以Composite模式使用到Iterator模式,和Chain of Responsibility模式类似。
Composite好处:
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。
如何使用Composite?
首先定义一个接口或抽象类,这是设计模式通用方式了,其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们(或称部件Component).
示例代码:
package composite_tree;
import java.util.ArrayList;
public abstract class Component {
public String name;
public ArrayList<Component> list;
public abstract void add(Component component);
public abstract void remove(Component component);
public abstract void display();
public Component(final String _name) {
this.name = _name;
}
}
package composite_tree;
public class Leaf extends Component {
public Leaf(String _name) {
super(_name);
}
@Override
public void add(Component component) {
System.out.println("you can't add component to a Leaf object");
}
@Override
public void remove(Component component) {
System.out.println("you can't remove component to a Leaf object");
}
@Override
public void display() {
System.out.println("|--" + name);
}
}
package composite_tree;
import java.util.ArrayList;
public class ConcreteComponent extends Component {
public ConcreteComponent(String _name){
super(_name);
list=new ArrayList<Component>();
}
@Override
public void add(Component component) {
list.add(component);
}
@Override
public void remove(Component component) {
if(list.contains(component)){
list.remove(component);
}
}
@Override
public void display() {
System.out.println(this.name);
for(Component mc:list){
mc.display();
}
}
}
package composite_tree;
public class Client {
public static void main(String[] args) {
Leaf leaf = new Leaf("计算机学院");
Leaf leaf2 = new Leaf("文学院");
//创建一级分类
ConcreteComponent con = new ConcreteComponent("院系");
con.add(leaf);
con.add(leaf2);
Leaf leaf3 = new Leaf("学生会");
Leaf leaf4 = new Leaf("团总支");
//创建一级分类
ConcreteComponent con2 = new ConcreteComponent("校团委");
con2.add(leaf3);
con2.add(leaf4);
Leaf leaf5 = new Leaf("报社");
Leaf leaf6 = new Leaf("外联部");
//创建二级分类
ConcreteComponent secondcon = new ConcreteComponent("学生会");
secondcon.add(leaf5);
secondcon.add(leaf6);
//在一级分类(校团委)下添加二级分类学生会
con2.add(secondcon);
//将所有的分类添加到root下
ConcreteComponent root = new ConcreteComponent("root");
root.add(con);
root.add(con2);
//显示节目列表
root.display();
}
}
结果:
root
院系
|--计算机学院
|--文学院
校团委
|--学生会
|--团总支
学生会
|--报社
|--外联部