前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >抽丝剥茧——组合设计模式

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

作者头像
石的三次方
发布2021-01-05 22:30:58
1970
发布2021-01-05 22:30:58
举报
文章被收录于专栏:石的三次方石的三次方

组合设计模式

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

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

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

  • 组合部件(Component):抽象角色,为要组合的对象提供统一的接口,「客户端要调用的功能。」
  • 叶子(Leaf):在组合中表示结对对象,叶子节点中不能有子节点
  • 合成部件(Composite):定义有子节点的行为,用来存储部件,实现在Component中的功能。

我们看一下它的类图实现:

我们再来看一下它的代码实现:

「组合部件(Component)」

代码语言:javascript
复制
abstract class Node {
    abstract void print();
}

「叶子节点(Leaf)」

代码语言:javascript
复制
class ConentNode extends Node {
    private String content ;
    public ConentNode(String content){ this.content = content ; }
    void print() {
        System.out.println(this.content);
    }
}

「合成部件(Composite)」

代码语言:javascript
复制
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 ;
    }
}

「测试」

代码语言:javascript
复制
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);
            }
        }
    }

「运行结果」

代码语言:javascript
复制
root
--chapter1
----content1_1
----content1_2
----content1_3
--chapter2
----content2_1
----content2_2

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 石的三次方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组合设计模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档