要素:
1 统一的接口,有对自身的add、remove、getChild、operation等方法
2 接口有 Leaf、Leaf构成的复杂Composite
package designpattern.structure.composite; public interface IComponent { public abstract void add(IComponent c); //增加成员 public abstract void remove(IComponent c); //删除成员 public abstract IComponent getChild(int i); //获取成员 public abstract void operation(); //业务方法 } package designpattern.structure.composite; import java.util.ArrayList; public class Composite implements IComponent { private ArrayList<IComponent> list = new ArrayList<IComponent>(); public void add(IComponent c) { list.add(c); } public void remove(IComponent c) { list.remove(c); } public IComponent getChild(int i) { return (IComponent)list.get(i); } public void operation() { //容器构件具体业务方法的实现 //递归调用成员构件的业务方法 for(Object obj:list) { ((IComponent)obj).operation(); } } } package designpattern.structure.composite; public class Leaf implements IComponent {
String name;
public Leaf(String name) {
this.name = name;
}
public void add(IComponent c) { // TODO Auto-generated method stub System.out.println("Leaf.add()"); } public IComponent getChild(int i) { // TODO Auto-generated method stub return null; } public void operation() { System.out.println("Leaf.operation() : " + this.name); } public void remove(IComponent c) { // TODO Auto-generated method stub } }
package designpattern.structure.composite;
/*
*
* 关键:
*
* 1 需要有add/remove/getchild/operation方法
* 2 Composite包含元素为component的list
* 3 Composite的operation 方法需要对所有child遍历执行其operation方法
*
*
* 1.组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
2.客户端可以 *** 一致地使用一个组合结构或其中单个对象 ( 重点!!!)*** ,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
3.在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
4.组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Composite composite = new Composite();
composite.add(new Leaf("leaf1"));
composite.add(new Leaf("leaf2"));
composite.add(new Leaf("leaf3"));
composite.add(new Leaf("leaf4"));
composite.operation();
}
}
我还是不太明白为什么叫做“组合”模式。。 是因为此模式中复杂对象都是简单对象‘组合’而成的吗? 就如一棵树,一个组织,
—— 一片叶子(或者说分支,branch)可以(广义的)构成一棵树,叶子和叶子通过树枝连接构成一颗更大的树——
—— 一个人可以(广义的)构成一小组织,多个人构成一个团队,多个团队构成部门,多部门构成机构,多机构构成公司
—— 而单个人、团队、部门、机构、公司—— 都可以广义的理解为组织
—— 这里的组织即为 IComponent , 最简单的组织为Leaf角色,其他有Leaf构成的组织为Composite角色