• 0

  • 496

抽丝剥茧——组合设计模式

3星期前

组合设计模式

兄弟们好,今天我们来聊一下组合设计模式。没错这里面的组合就是我们经常用来代替继承的组合。

而组合设计模式强调的是:「将对象组合成树形结构来表现“部分和整体”的层次结构,可以让客户端通过一种方式处理单个对象或者多个对象组合。」

我们看一下它的角色组成:

  • 组合部件( 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 复制代码

好了,到这里组合设计模式就讲完了,其本质就是「通过将不同的对象组合成树形的结构,让客户端可以统一通过同一个方法进行调用执行。」

本文使用 mdnice 排版

免责声明:文章版权归原作者所有,其内容与观点不代表Unitimes立场,亦不构成任何投资意见或建议。

程序员

496

相关文章推荐

未登录头像

暂无评论