组合模式:允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
组合模式类图:
Client:客户使用Component接口操作组合中的对象。
Component:Component为组合中的所有对象定义一个接口,不管是组合还是节点,Component可以为add(),remove(),eachChild()实现一些默认的行为。
Leaf:叶节点没有孩子。叶节点通过实现Composite支持的操作,定义了组合内元素的行为。
Composite:Composite的角色是要定义组件的行为,而这样的组件具有子节点。
抽象类Component代码实现:
public abstract class Component {
String name;
public Component(String name){
this.name = name;
}
public abstract void Add(Component component);
public abstract void remove(Component component);
public abstract void eachChild();
}
Leaf类代码实现:
public class Leaf extends Component{
public Leaf(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void Add(Component component) {
// TODO Auto-generated method stub
}
@Override
public void remove(Component component) {
// TODO Auto-generated method stub
}
@Override
public void eachChild() {
// TODO Auto-generated method stub
System.out.println("叶节点:"+name);
}
}
Composite类代码实现:
public class Composite extends Component{
ArrayList<Component> list = new ArrayList<Component>();
public Composite(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void Add(Component component) {
// TODO Auto-generated method stub
list.add(component);
}
@Override
public void remove(Component component) {
// TODO Auto-generated method stub
list.remove(component);
}
@Override
public void eachChild() {
// TODO Auto-generated method stub
System.out.println("节点:"+name);
for(Component component : list){
component.eachChild();
}
}
}
Client类代码实现:
public class Client {
public static void main(String[] args){
Component rootComposite = new Composite("根节点");
Component leftComposite = new Composite("左子节点");
Component rightComposite = new Composite("右子节点");
Component leftleaf1 = new Leaf("左叶节点1");
Component leftleaf2 = new Leaf("左叶节点2");
leftComposite.Add(leftleaf1);
leftComposite.Add(leftleaf2);
rootComposite.Add(leftComposite);
rootComposite.Add(rightComposite);
rootComposite.eachChild();
}
}
运行结果:
节点:根节点
节点:左子节点
叶节点:左叶节点1
叶节点:左叶节点2
节点:右子节点