登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
掌握设计模式--组合模式
掌握设计模式--组合模式
[ 复制链接 ]
睁扼妤
2025-6-6 14:10:09
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
组合模式(Composite Pattern)
组合模式(Composite Pattern)是一种结构型设计模式,它用于将对象组织成树形结构,以表示部分-整体的层次结构。通过组合模式,客户端可以统一对待单个对象和组合对象,从而简化了客户端代码的复杂性。
组合模式的核心思想
统一的接口
:通过抽象类或接口将单个对象和组合对象统一起来;
递归组合
:组合对象中可以包含单个对象或其他组合对象;
透明性
:客户端可以一致地调用单个对象和组合对象的方法,而无需区分两者的差异。
组合模式的角色
组件(Component)
定义单个对象和组合对象的公共接口,例如通用操作(add、remove、getChild等)。
叶子节点(Leaf)
表示树形结构中的基本单元,不能再包含其他对象。它实现了组件接口,但不支持添加或移除操作。
组合对象(Composite)
表示树形结构中的复杂单元,可以包含叶子节点或其他组合对象。它实现组件接口,并负责管理其子对象的操作。
示例代码
组合模式解析XML或 HTML 元素结构的代码示例。我们将 XML/HTML 元素看作“部分-整体”结构,其中:
叶子节点(leaf)
:表示没有子节点的元素(如 <img> 或 )。
组合节点(Composite)
:表示可以包含其他子元素的元素(如 或 )。
两种节点使用同一种的顶层抽象,属于同一类对象,统称为元素(节点)。
类图
1. 抽象组件
HTML顶层元素抽象类。你也可以定义一个顶层接口,然后在抽象类中实现基础功能。
public abstract class HTMLElement {
protected String name;
public HTMLElement(String name) {
this.name = name;
}
public abstract void render(int level);
public HTMLElement getChild(int index) {
throw new UnsupportedOperationException();
}
// 默认行为:叶子结点禁止新增元素
public void addChild(HTMLElement element) {
throw new UnsupportedOperationException();
}
// 默认行为:叶子结点禁止移除子元素
public void removeChild(HTMLElement element) {
throw new UnsupportedOperationException();
}
// 辅助方法:生成缩进
protected String generateIndent(int level) {
StringBuilder indent = new StringBuilder();
for (int i = 0; i < level * 2; i++) {
indent.append(" "); // 每层缩进2个空格
}
return indent.toString();
}
}
复制代码
2. 组合结点
表示可以包含子元素的HTML标签
public class HTMLComposite extends HTMLElement {
private List<HTMLElement> children = new LinkedList<>();
public HTMLComposite(String name) {
super(name);
}
@Override
public void addChild(HTMLElement element) {
children.add(element);
}
@Override
public void removeChild(HTMLElement element) {
children.remove(element);
}
@Override
public HTMLElement getChild(int index) {
return children.get(index);
}
@Override
public void render(int level) {
System.out.println(generateIndent(level) + "<" + name + ">");
for (HTMLElement child : children) {
child.render(level + 1); // 子节点递归调用
}
System.out.println(generateIndent(level) + "</" + name + ">");
}
}
复制代码
3.叶子节点
表示没有子元素的HTML标签
public class HTMLLeaf extends HTMLElement {
public HTMLLeaf(String name) {
super(name);
}
@Override
public void render(int level) {
System.out.println(generateIndent(level) + "<" + name + " />");
}
}
复制代码
测试
public class CompositePatternHTMLDemo {
public static void main(String[] args) {
// 创建HTML结构
HTMLElement html = new HTMLComposite("html");
HTMLElement body = new HTMLComposite("body");
HTMLElement div = new HTMLComposite("div");
HTMLElement img = new HTMLLeaf("img");
HTMLElement input = new HTMLLeaf("input");
HTMLElement p = new HTMLLeaf("p");
// 组合结构
html.addChild(body);
body.addChild(div);
body.addChild(input);
div.addChild(img);
div.addChild(p);
// 渲染HTML结构
html.render(0);
// 去除某个节点
div.removeChild(p);
html.render(0);
}
}
复制代码
测试结果:
<html>
<body>
<img />
<p />
<input />
</body>
</html>
<html>
<body>
<img />
<input />
</body>
</html>
复制代码
从类图或测试类(使用者)中可以看出,使用者直接依赖于具体的类,属于高耦合的一种编程方式。
简单优化(结合其它设计模式)
加入一个工厂类来创建组合节点和叶子结点
类图结构
变为
工厂类代码
[code]public class HTMLElementFactory { private static Map
掌握
设计模式
组合
模式
相关帖子
15.结构型 - 组合模式 (Composite Pattern)
观察者模式,发布/订阅模式,与回调函数
16.结构型 - 享元模式 (Flyweight Pattern)
AI 付费模式终极对比:ChatGPT、Gemini、Claude 定价策略拆解,谁最值得买单?
“静态回调+上下文指针”模式实现回调机制
RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?
17.行为型 - 观察者模式 (Observer Pattern)
设计模式简述
掌握相关性分析:读懂数据间的“悄悄话”
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
15.结构型 - 组合模式 (Composite Pattern)
0
441
即息极
2025-12-12
安全
观察者模式,发布/订阅模式,与回调函数
1
53
粉押淫
2025-12-13
安全
16.结构型 - 享元模式 (Flyweight Pattern)
0
705
莠畅缕
2025-12-15
安全
AI 付费模式终极对比:ChatGPT、Gemini、Claude 定价策略拆解,谁最值得买单?
0
659
匝抽
2025-12-16
安全
“静态回调+上下文指针”模式实现回调机制
1
616
嫂潍
2025-12-17
业界
RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?
1
758
滕佩杉
2025-12-18
安全
17.行为型 - 观察者模式 (Observer Pattern)
1
919
抽厉
2025-12-19
安全
设计模式简述
0
268
厨浴
2025-12-19
业界
掌握相关性分析:读懂数据间的“悄悄话”
1
104
东门芳洲
2025-12-20
回复
(1)
赖秀竹
2025-11-11 17:46:46
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
过来提前占个楼
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
睁扼妤
2025-11-11 17:46:46
关注
0
粉丝关注
14
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994892
kk14977
6845358
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9981
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9949
查看更多
今日好文热榜
231
流量暴跌 96%:AI 聊天机器人正在构建危险
169
AI生成论文查重能过么?8款AI写论文软件测
504
懒人长期理财的投资系统
505
第40次CCFCSP认证邮寄
865
第40次CCFCSP认证邮寄
851
第40次CCFCSP认证邮寄
438
用 .NET MAUI 10 + VS Copilot 从 0 开发一
868
【节点】[GammaToLinearSpaceExact节点]原
378
[20251218]测试sql语句子光标的执行性能(21
493
HECTF2025
15
《C语言程序设计》琐碎知识点总结笔记
378
NGD-SLAM(三)
46
AI 领域职业发展分享总结(吴恩达新课内容
103
【面试题】数据库事务隔离与传播属性是什么
190
2025年儿童羽绒服十大名牌排名:宝妈选购指
313
2025年儿童羽绒服十大名牌排名:宝妈选购指
761
Flink源码阅读:如何生成ExecutionGraph
421
Github项目CI&CD部署
314
AgentScope深入分析-LLM&MCP
600
《痞子衡嵌入式半月刊》 第 120 期