JAVA 设计模式 组合模式

用途

组合模式 (Component)

将对象组合成树形结构以表示“部分-整体”的层次结构。 组合模式使得用户对单个对象和组合对象的使用具有唯一性

组合模式是一种结构型模式

结构

图-组合模式结构图

Component : 组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理 Component 的子部件。

abstract class Component {
 protected String name;
 
 public Component(String name) {
 this.name = name;
     }
 
 public abstract void Add(Component c);
 public abstract void Remove(Component c);
 public abstract void Display(int depth);
 }

Leaf : 表示叶节点对象。叶子节点没有子节点。

class Leaf extends Component {
 
 public Leaf(String name) {
 super(name);
     }
 
     @Override
 public void Add(Component c) {
         System.out.println("Can not add to a leaf");
     }
 
     @Override
 public void Remove(Component c) {
         System.out.println("Can not remove from a leaf");
     }
 
     @Override
 public void Display(int depth) {
         String temp = "";
 for (int i = 0; i < depth; i++) 
             temp += '-';
         System.out.println(temp + name);
     }
 
 }

Composite : 定义枝节点行为,用来存储子部件,在 Component 接口中实现与子部件相关的操作。例如 Add 和 Remove。

class Composite extends Component {
 
 private List<Component> children = new ArrayList<Component>();
 
 public Composite(String name) {
 super(name);
     }
 
     @Override
 public void Add(Component c) {
         children.add(c);
     }
 
     @Override
 public void Remove(Component c) {
         children.remove(c);
     }
 
     @Override
 public void Display(int depth) {
         String temp = "";
 for (int i = 0; i < depth; i++) 
             temp += '-';
         System.out.println(temp + name);
 
 for (Component c : children) {
             c.Display(depth + 2);
         }
     }
 
 }

Client : 通过 Component 接口操作结构中的对象。

public class CompositePattern {
 
 public static void main(String[] args) {
         Composite root = new Composite("root");
         root.Add(new Leaf("Leaf A"));
         root.Add(new Leaf("Leaf B"));
 
         Composite compX = new Composite("Composite X");
         compX.Add(new Leaf("Leaf XA"));
         compX.Add(new Leaf("Leaf XB"));
         root.Add(compX);
 
         Composite compXY = new Composite("Composite XY");
         compXY.Add(new Leaf("Leaf XYA"));
         compXY.Add(new Leaf("Leaf XYB"));
         compX.Add(compXY);
 
         root.Display(1);
     }
 
 }

应用场景

1、想要表示对象的部分-整体层次结构。

2、想要客户端忽略组合对象与单个对象的差异,客户端将统一地使用组合结构中的所有对象。

关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统

文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也 可以是目录。

按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式。

要点

组合模式定义由 Leaf 对象和 Composite 对象组成的类结构;

它使得客户端变得简单;

它使得添加或删除子部件变得很容易。

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏禁心尽力

Web层框架对网站中所有异常的统一处理

  一个网站的异常信息作为专业的人士,是不会轻易暴露给用户的,因为那样狠不安全,显得你漏是一回事,只要还是考虑到网站的数据安全问题,下面给大家分享一下一些常见的...

2048
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第3章 3.1 Hello World 实例

3.1 Hello World 实例 在上一章中介绍了Drools5x版本中规则引擎使用的实例,很明显在Drools7中KnowledgeBase类已经标注为“...

2276
来自专栏大内老A

[ASP.NET MVC]为HtmlHelper添加一个RadioButtonList扩展方法

在前面一篇文章中,我们通过对HtmlHelper的扩展简化了对DropDownList(Single-Line-Select)和ListBox(Multiple...

18110
来自专栏腾讯移动品质中心TMQ的专栏

管中窥豹:结合NewApi实践来了解Lint代码扫描

导读 lint是著名的C/C++语言静态代码分析工具之一,Android Lint顾名思义,针对Android的静态代码分析工具,能够对Android项目中潜在...

18410
来自专栏林冠宏的技术文章

Go 实现 自动检索 API 错误码代码行 并 打印成文档,例 markDown 形式等

1073
来自专栏MasiMaro 的技术博文

OLEDB 数据变更通知

除了之前介绍的接口,OLEDB还定义了其他一些支持回调的接口,可以异步操作OLEDB对象或者得到一些重要的事件通知,从而使应用程序有机会进行一些必要的处理。其中...

583
来自专栏Python

Flask快速入门,知识整理

一、Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来)   Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服...

3009
来自专栏枕边书

PHP模拟发送POST请求之五curl基本使用和多线程优化

今天来介绍PHP模拟发送POST请求的重型武器——cURL函数库的使用和其多线程的优化方法。 说起cURL函数,可谓是老生常谈,但网上许多资料都在关键部分语焉不...

2300
来自专栏行者常至

(17)Struts2_异常处理: exception-mapping 元素

332
来自专栏QQ音乐技术团队的专栏

打通Android Gradle编译过程的任督二脉

本文主要是基于自己在工作当中的一些Android Gradle实践经验,对gradle相关知识做的一个简单总结和分享,希望对大家有帮助。 首先会讲Gradle大...

6988

扫码关注云+社区