定义
又叫部分-整体模式,是一种将对象组合成树状层次结构的模式,用来表示整体和部分的关系,使用户对单个对象和组合对象具有一致的访问方式。
角色构成
1.抽象构件(component):作为树枝构件和树叶构件的接口或抽象基类
2.树叶构件:是组合中的没有子节点的分节点对象,(可以和树枝构件合并,看做是没有子节点的树枝构件),实现抽象构件中的公共接口。
3.树枝构件:是组合中的分支节点对象,有子节点,实现抽象构件中的公共接口。主要作用是管理和存储子节点,一般具有add() remove()和 getChild()方法。
UML类图:
//公共接口
public interface Node {
List<Node> getChild();
}
//树叶构件,没有子节点 不需要add remove 和 getChild()
public class LeafNode implements Node {
private String name;
public LeafNode(String name) {
this.name = name;
}
@Override
public List<Node> getChild() {
//没有子节点
return null;
}
}
//树枝构件,有子节点的分支
public class ChildNode implements Node {
private String name = "";
List<Node> childNodes = new ArrayList<>();
public ChildNode(String name) {
this.name = name;
}
@Override
public List<Node> getChild() {
return childNodes;
}
public void addChild(Node node){
childNodes.add(node);
}
public void delChild(Node node){
childNodes.remove(node);
}
}
//测试类
public class CompositeClient {
static ChildNode firstNote = new ChildNode("根");
public static void setData(){
firstNote.addChild(new ChildNode("北京"));
firstNote.addChild(new ChildNode("上海"));
ChildNode szNode = new ChildNode("深圳");
firstNote.addChild(szNode);
szNode.addChild(new ChildNode("龙岗"));
szNode.addChild(new ChildNode("福田"));
ChildNode areaNode = new ChildNode("南山");
szNode.addChild(areaNode);
areaNode.addChild(new ChildNode("蛇口"));
areaNode.addChild(new ChildNode("南园"));
ChildNode dotNote = new ChildNode("南山");
areaNode.addChild(dotNote);
areaNode.addChild(new LeafNode("南油"));
System.out.println(firstNote);
}
public static void main(String[] args) {
setData();
}
}
组合模式的主要优点有:
组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
其主要缺点是:
设计较复杂,客户端需要花更多时间理清类之间的层次关系;
不容易限制容器中的构件;
不容易用继承的方法来增加构件的新功能;