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 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

从零开始学C++之IO流类库(四):输出流格式化(以操纵子方式格式化,以ios类成员函数方式格式化)

一、以操纵子方式格式化 数据输入输出的格式控制使用系统头文件<iomanip>中提供的操纵符。把它们作为插入操作符<<的输出对象即可。如setiosflags、...

2230
来自专栏河湾欢儿的专栏

性能优化

751
来自专栏大数据钻研

如何编写简练清晰的HTML代码?

如何提升 Web 页面的性能,很多开发人员从多个方面来下手如 JavaScript、图像优化、服务器配置,文件压缩或是调整 CSS。 很显然 HTML 已经达到...

3456
来自专栏专注数据中心高性能网络技术研发

HERD--GCC宏

减少跳转语句失效时CPU等待取指令时间,提高CPU效率 使用__builtin_expect(EXP,N) 意思是EXP==N的概率很大 一般封装为LIKELY...

2745
来自专栏Nian糕的私人厨房

Web前端性能优化(二)

我们在浏览器地址栏输入网址之后,浏览器会对我们输入的 url 进行解析,并对相应的 IP 地址发起请求,请求所返回的是一段 HTML 文档,浏览器对该段 HTM...

652
来自专栏狮乐园

async-for-js

插入3个div元素,其中第二个div元素使用setTimeout模拟异步操作,理想的插入顺序为div1 div2 div3,但这里的代码的插入顺序为div1 d...

562
来自专栏余林丰

组合模式

在之前有接触过组合模式,那是第一次接触设计模式,觉得什么是组合模式啊?什么部分与整体。现在再来看组合模式,觉得实际上并没有那么神秘。 组合模式:将对象组合成树形...

1855
来自专栏C/C++基础

C++inline函数简介

inline函数是由inline关键字来定义,引入inline函数的主要原因是用它替代C中复杂易错不易维护的宏函数。

862
来自专栏Linyb极客之路

JVM 方法内联

调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。

824
来自专栏游戏杂谈

【JavaScript设计模式】-- 单例模式

某些JavaScript的UI组件中,需要获取页面的DOM对象,只需要调用getInstance方法时返回该实例(调用时才判断是否已被初始化)的引用即可。

783

扫码关注云+社区