组合模式-Composite
名称:
组合模式(Composite Pattern)-对象结构型模式
问题:
Compose Objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly。
将对象组合成树结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
适用性:
-你想表示对象的部分-整体层次结构。
-你希望用户忽略组合对象与单个对象的不同、用户将统一的使用组合结构中的所有对象。
协作:
用户使用Component类接口与组合结构中的对象进行交互。如果接受者是一个叶节点,则直接处理请求。如果接受者是Composite,它通常将请求发送给它的子部件,在转发之前与/或之后可能执行一些辅助操作。
优点和缺点:
1、定义了包含基本对象和组合对象的类层次结构。
2、简化客户代码。
3、使得更容易增加新类型的组件。
4、使你的设计变得更加一般化。
解决方案:
1、 模式的参与者
1、Component
-为组合中的对象声明接口。
-在适当的情况下,实现所有类共有接口的缺省行为。
-声明一个接口用于访问和管理Component的子组件。
-(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。
2、Leaf
-在组合中表示叶节点对象,叶节点没有子节点。
-在组合中定义图元对象的行为。
3、Composite
-定义有子部件的那些部件的行为。
-存储子部件。
-在Component接口中实现与子部件有关的操作。
4、Client
-通过Component接口操纵组合部件的对象。
2.实现方式
interface Component { public void add(Component c); public void remove(Component c); public Component getChild(int i); public void operation(); }
class Leaf implements Component { private String name; public Leaf(String name) { this.name=name; } public void add(Component c){ } public void remove(Component c){ } public Component getChild(int i) { return null; } public void operation() { System.out.println("leaf:"+name); } }
class Composite implements Component { private ArrayList<Component> children=new ArrayList<Component>(); public void add(Component c) { children.add(c); } public void remove(Component c) { children.remove(c); } public Component getChild(int i) { return children.get(i); } public void operation() { for(Object obj:children) { ((Component)obj).operation(); } } }
public class CompositePattern { public static void main(String[] args) { Component c0=new Composite(); Component c1=new Composite(); Component leaf1=new Leaf("1"); Component leaf2=new Leaf("2"); Component leaf3=new Leaf("3"); c0.add(leaf1); c0.add(c1); c1.add(leaf2); c1.add(leaf3); c0.operation(); } }
参考资料
《设计模式:可复用面向对象软件的基础》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具