组合设计模式
兄弟们好,今天我们来聊一下组合设计模式。没错这里面的组合就是我们经常用来代替继承的组合。
而组合设计模式强调的是:将对象组合成树形结构来表现“部分和整体”的层次结构,可以让客户端通过一种方式处理单个对象或者多个对象组合。
我们看一下它的角色组成:
- 组合部件(
Component
):抽象角色,为要组合的对象提供统一的接口,客户端要调用的功能。 - 叶子(
Leaf
):在组合中表示结对对象,叶子节点中不能有子节点 - 合成部件(
Composite
):定义有子节点的行为,用来存储部件,实现在Component
中的功能。
我们看一下它的类图实现:
我们再来看一下它的代码实现:
组合部件(Component)
abstract class Node {
abstract void print();
}
叶子节点(Leaf)
class ConentNode extends Node {
private String content ;
public ConentNode(String content){ this.content = content ; }
void print() {
System.out.println(this.content);
}
}
合成部件(Composite)
class MiddleNode extends Node {
private List<Node> listNodes = new ArrayList<>();
private String content ;
public List<Node> getListNodes(){return listNodes;}
public MiddleNode(String content){ this.content = content ; }
void print() {
System.out.println(this.content);
}
public MiddleNode addNode(Node node){
this.listNodes.add(node);
return this ;
}
}
测试
public static void main(String[] args) {
MiddleNode node = new MiddleNode("root");
MiddleNode node1 = new MiddleNode("chapter1");
MiddleNode node2 = new MiddleNode("chapter2");
Node node1_1 = new ConentNode("content1_1");
Node node1_2 = new ConentNode("content1_2");
Node node1_3 = new ConentNode("content1_3");
Node node2_1 = new ConentNode("content2_1");
Node node2_2 = new ConentNode("content2_2");
node.addNode(node1).addNode(node2);
node1.addNode(node1_1).addNode(node1_2).addNode(node1_3);
node2.addNode(node2_1).addNode(node2_2);
printNodeContent(node,0);
}
//通过这个方法打印每一个节点的值,递归的方式(一个树遍历)
static void printNodeContent(Node node,int depth){
//为了增加层次,每一层打印一个--
for (int i = 0; i < depth; i++) {
System.out.print("--");
}
node.print();
if(node instanceof MiddleNode){
MiddleNode node1 = (MiddleNode)node ;
for (Node node2 : node1.getListNodes()){
printNodeContent(node2,depth+1);
}
}
}
运行结果
root
--chapter1
----content1_1
----content1_2
----content1_3
--chapter2
----content2_1
----content2_2
好了,到这里组合设计模式就讲完了,其本质就是通过将不同的对象组合成树形的结构,让客户端可以统一通过同一个方法进行调用执行。