1.为什么要使用组合模式
组合模式其实就是一种树形的数据结构,在接口/抽象类中定义一个方法,不论是根节点,还是树枝结点还是叶子结点,都可以直接调用,形成了一种“部分-整体”的结构。
2.看一下类图
Component是抽象类,有自己的名字,并定义了获取自己孩子结点的方法,并实现了display的方法,Composite是根节点和数枝结点的实现,Leaf是叶子结点的实现
3.实现
抽象类
public abstract class Component {
private String name;
public String getName() {
return name;
}
public Component(String name) {
this.name = name;
}
abstract List<Component> getChildren();
abstract void setChildren(List<Component> children);
//最重要的是这个方法
void display(){
System.out.println(this.name);
if(null != getChildren()){
for (Component component : getChildren()){
component.display();//递归打印
}
}
}
}
Composite和Leaf
public class Composite extends Component{
private List<Component> children;
public Composite(String name) {
super(name);
}
public void setChildren(List<Component> children) {
this.children = children;
}
@Override
public List<Component> getChildren() {
return children;
}
}
public class Leaf extends Component{
public Leaf(String name) {
super(name);
}
@Override
List<Component> getChildren() {
return null;
}
@Override
void setChildren(List<Component> children) {
//空方法
}
}
main方法
/**
* Created by hr on 2017/07/21.
* 组合模式
*/
public class Main {
public static void main(String[] args) {
//设置根节点
Component root = new Composite("root");
//设置树枝节点
Component branch1 = new Composite("branch1");
Component branch2 = new Composite("branch2");
List<Component> branches = new ArrayList<>();
branches.add(branch1);
branches.add(branch2);
//设置叶子结点
Component leaf1 = new Leaf("leaf1");
Component leaf2 = new Leaf("leaf2");
Component leaf3 = new Leaf("leaf3");
List<Component> leaves = new ArrayList<>();
leaves.add(leaf1);
leaves.add(leaf2);
leaves.add(leaf3);
//组建成树
root.setChildren(branches);
branch1.setChildren(leaves);
//打印树
System.out.println("=========打印整颗树========");
root.display();
//或者打印一个树枝
System.out.println("=========打印branch1======");
branch1.display();
}
}
//输出结果
=========打印整颗树========
root
branch1
leaf1
leaf2
leaf3
branch2
=========打印branch1======
branch1
leaf1
leaf2
leaf3