用途组合模式 (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

temp += '-';

System.out.println(temp + name);

}

}

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

class Composite extends Component {

private List children = new ArrayList();

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

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 对象组成的类结构;

它使得客户端变得简单;

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

推荐

参考资料

《大话设计模式》

《HeadFirst设计模式》

java设计模式 组合_JAVA 设计模式 组合模式相关推荐

  1. java设计模式教程_Java设计模式教程

    java设计模式教程 课程大纲 架构和计算机科学中的设计模式是记录特定专业领域中设计问题的解决方案的正式方法. 这个想法是由建筑师Christopher Alexander在建筑领域引入的,并已被修改 ...

  2. java 设计模式 示例_Java设计模式–示例教程

    java 设计模式 示例 Design Patterns are very popular among software developers. A design pattern is a well- ...

  3. java装饰模式理解_Java设计模式之装饰模式趣谈

    JVM:"上次给我招的工人不错啊!" oo程序员:"---.." JVM:"现在来我开的博物馆生意越来越好了,原来"舞台剧"的方式 ...

  4. java中组合_java中组合模式详解和使用方法

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  5. java设计模式 桥接_Java设计模式百例 - 桥接模式

    桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的接口,使得 ...

  6. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  7. java工厂方法_Java设计模式之工厂方法模式

    2.工厂方法模式 <设计模式之禅>中用神话故事女娲造人来比概述工厂方法模式. 女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生 ...

  8. java 设计模式 路由器_java设计模式2————工厂模式

    java设计模式2----工厂模式 1.工厂模式介绍: 1.1.实现了创建者与调用者的分离 1.2.详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.3.所遵循的OOP原则: 开闭原则:对扩展 ...

  9. java设计模式 连续处理_Java 设计模式(12) —— 状态模式

    一.状态模式 能根据内部状态的变化,改变对象的行为,看起来好像修改了类 状态模式 二.示例 智能糖果机:需要设计一款自助购买的糖果机,糖果机的状态有 准备使用(接下来可投入硬币) 投入硬币(接下来可摇 ...

最新文章

  1. python spilt() 方法 ,分隔字符串
  2. android jks sha1,Android 获取签名文件jks的SHA1值或者SHA256的值
  3. 前端二十七:四彩边框
  4. 在Init之前究竟执行了什么?
  5. 【华为云踩坑】开启了入方向规则的 tcp/80 端口,仍然无法访问
  6. BUUCTF的Web真题学习整理(一)
  7. 保持学习,从这几个公众号开始!
  8. 【渝粤题库】国家开放大学2021春3896人文英语1题目
  9. 激战 5G:国内外技术的分水岭
  10. node.js中npm包管理工具
  11. 无人机4G数传一站多机模式
  12. 学生成绩管理系统设计java_java学生成绩管理系统设计与实现
  13. VS如何安装.nupkg文件
  14. iOS crash dSYM
  15. 反距离加权插值IDW计算详细步骤
  16. 简述er图的作用_er图的作用是什么
  17. 【Maven打包报错解决方案】Using ‘UTF-8‘ encoding to copy filtered resources.
  18. 区块链为什么叫区块链
  19. 羊毛出在狗身上让猪来买单 - 智能音箱背后的平台经济...
  20. 个人计算机视觉学习路线

热门文章

  1. node webkit(nw.js) 设置自动更新
  2. 添加dubbo xsd的支持
  3. 【Data Cluster】真机环境下MySQL数据库集群搭建
  4. node截图服务可用性报告
  5. 多款优秀的 JS MVC 框架对比
  6. MySQL日期时间函数大全(转)
  7. 发一个flash+PHP的简单上传代码
  8. 针对数据科学家和数据工程师的4条SQL技巧
  9. Seaborn:Python
  10. Linux程序实现弹框,jQuery实现弹出框 效果绝对美观