针对问题:组合模式使我们在处理树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式结构图:
组合模式实现代码:
/**
* 为树叶或树枝抽象一个接口
* @author bruce
*
*/
public abstract class Component {
public abstract void operation();
public void add(Component component){
throw new UnsupportedOperationException();
}
public void remove(Component component){
throw new UnsupportedOperationException();
}
public Component getChild(int index){
throw new UnsupportedOperationException();
}
}
/**
* 树叶
* @author bruce
*
*/
public class Leaf extends Component{
private String name;
public Leaf(String name){
this.name=name;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println(name);
}
}
/**
* 树枝
* @author bruce
*
*/
public class Composite extends Component{
private List<Component> list=new ArrayList<Component>();
private String name;
public Composite(String name){
this.name=name;
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println(name);
/**
* for..each 递归调用operation()
*/
Iterator<Component> iterator=list.iterator();
while(iterator.hasNext()){
Component component=iterator.next();
component.operation();
}
}
@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 Component getChild(int index) {
// TODO Auto-generated method stub
return list.get(index);
}
}
/**
* 测试
* @author bruce
*
*/
public class Client {
public static void main(String[] args) {
Component c=new Composite("C:/");
Component cl=new Leaf("test.java");
Component cc=new Composite("C:/program file/");
Component cclA=new Leaf("QQ.exe");
Component cclB=new Leaf("360.exe");
cc.add(cclA);
cc.add(cclB);
c.add(cl);
c.add(cc);
c.operation();
/**
* output:
*
C:/
test.java
C:/program file/
QQ.exe
360.exe
*/
}
}