参考:https://www.cnblogs.com/liaoweipeng/p/5791049.html
将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 "组合对象" 的含义。组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。经典案例:系统目录结构,网站导航结构等。(百度百科)
/**
* 公共对象声明
*
*/
public abstract class Component {
protected String name;
public Component(String name){
this.name=name;
}
public Component(){
}
public abstract void add(Component component);
public abstract void remove(Component component);
public abstract void display(int depth);
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 枝节点类,继承公共对象,且内部包含子对象列表
*
*/
public class ConcreteCompany extends Component{
private List<Component> list;
public ConcreteCompany(String name) {
super(name);
list=new ArrayList<Component>();
}
public ConcreteCompany(){
list=new ArrayList<Component>();
}
@Override
public void add(Component component) {
list.add(component);
}
@Override
public void remove(Component component) {
list.remove(component);
}
@Override
public void display(int depth) {
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(new String(sb) + this.getName());
for (Component c : list) {
c.display(depth + 2);
}
}
}
/**
* 叶子节点
*
*/
public class Leaf extends Component{
public Leaf(String name){
super(name);
}
@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 display(int depth) {
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(new String(sb) + this.getName());
}
}