一、概述

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

二、适用性

1.你想表示对象的部分--整体层次结构的时候。

2.你希望用户忽略组合对象与单个对象的不同的时候,用户将统一地使用组合结构中的所有对象。

三、参与者

1.Component:为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并且在适当的情况下实现它。

2.Leaf:在组合中表示叶节点对象,叶节点没有子节点。在组合中定义节点对象的行为。

3.Composite:定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。

4.Client:通过Component接口操作组合部件的对象。

四、类图

五、示例

Component

  1. package cn.lynn.composite;
  2. import java.util.List;
  3. public abstract class Saint {
  4. private String name;
  5. protected List<Saint> saints;
  6. public List<Saint> getSaints() {
  7. return saints;
  8. }
  9. public String getName() {
  10. return name;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public void printInfo() {
  16. System.out.println(name);
  17. }
  18. protected abstract void obtain(Saint saint);
  19. protected abstract void deprive(Saint saint);
  20. }

Leaf

  1. package cn.lynn.composite;
  2. public class BronzeSaint extends Saint {
  3. public BronzeSaint(String name) {
  4. super.setName(name);
  5. super.saints = null; // 青铜圣斗士已经是最低级的
  6. }
  7. @Override
  8. public void obtain(Saint saint) {
  9. }
  10. @Override
  11. public void deprive(Saint saint) {
  12. }
  13. }
  1. package cn.lynn.composite;
  2. public class SilverSaint extends Saint {
  3. public SilverSaint(String name) {
  4. super.setName(name);
  5. super.saints = null; // 白银圣斗士比青铜圣斗士强点
  6. }
  7. @Override
  8. public void obtain(Saint saint) {
  9. }
  10. @Override
  11. public void deprive(Saint saint) {
  12. }
  13. }

Composite

  1. package cn.lynn.composite;
  2. import java.util.ArrayList;
  3. public class GoldSaint extends Saint {
  4. public GoldSaint(String name) {
  5. super.setName(name);
  6. super.saints = new ArrayList<Saint>(); // 还是黄金圣斗士牛逼,竟然会修圣衣
  7. }
  8. @Override
  9. public void obtain(Saint saint) {
  10. super.saints.add(saint);
  11. }
  12. @Override
  13. public void deprive(Saint saint) {
  14. super.saints.remove(saint);
  15. }
  16. }

Client

  1. package cn.lynn.composite;
  2. import java.util.List;
  3. public class Client {
  4. public static void main(String[] args) {
  5. Saint goldSaint = new GoldSaint("穆先生");
  6. Saint silverSaint = new SilverSaint("魔铃");
  7. Saint bronzeSaint1 = new BronzeSaint("星矢");
  8. Saint bronzeSaint2 = new BronzeSaint("一辉");
  9. Saint bronzeSaint3 = new BronzeSaint("紫龙");
  10. goldSaint.obtain(silverSaint);
  11. goldSaint.obtain(bronzeSaint1);
  12. goldSaint.obtain(bronzeSaint2);
  13. goldSaint.obtain(bronzeSaint3);
  14. StringBuffer sb = new StringBuffer();
  15. sb.append(goldSaint.getName()+"指导");
  16. List<Saint> saints = goldSaint.getSaints();
  17. for (Saint saint : saints) {
  18. sb.append(saint.getName());
  19. sb.append("、");
  20. }
  21. sb = sb.deleteCharAt(sb.length() - 1);
  22. sb.append("修圣衣!");
  23. System.out.println(sb.toString());
  24. }
  25. }

Result

  1. 穆先生指导魔铃、星矢、一辉、紫龙修圣衣!

GoF23种设计模式之结构型模式之组合模式的更多相关文章

  1. GoF23种设计模式之结构型模式之桥接模式

    一.概述         将类的抽象部分与实现分部分离开来,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和实现之间有一个固定的绑定关系的时候.例如:在程序运行时实现部分应可以被选择或切换. ...

  2. GoF23种设计模式之结构型模式之外观模式

    一.概述         为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口的时候.子系统 ...

  3. GoF23种设计模式之结构型模式之代理模式

    一.概述 为其他对象提供一种代理以控制对这个对象的访问. 二.适用性 1.远程代理(RemoteProxy):为一个对象在不同的地址空间土工局部代表. 2.虚代理(VirtualProxy):根据需要 ...

  4. GoF23种设计模式之结构型模式之享元模式

    一.概述  运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...

  5. GoF23种设计模式之结构型模式之适配器模式

    一.概述         将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,但是它的接口不符合 ...

  6. GoF23种设计模式之结构型模式之装饰模式

    一.概述 动态地给一个对象添加一些额外的职责.装饰模式比生成子类更为灵活. 二.适用性 1.在不影响其他对象的情况下,以动态.透明的方式给但个对象添加职责. 2.处理那些可以撤销的职责. 3.当不能采 ...

  7. Go语言实现的23种设计模式之结构型模式

    摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...

  8. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

  9. GoF的23种设计模式之结构型模式的特点和分类

    结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...

随机推荐

  1. NET Core使用Quartz

    NET Core使用Quartz 一.前言运用场景 Quartz.Net是一个强大.开源.轻量的作业调度框架,在平时的项目开发当中也会时不时的需要运用到定时调度方面的功能,例如每日凌晨需要统计前一天的 ...

  2. NET Core 2.1.0 now available

    ASP.NET Core 2.1.0 now available https://blogs.msdn.microsoft.com/webdev/2018/05/30/asp-net-core-2-1 ...

  3. awk单引号处理

    awk中使用单引号,常规字符串,'\''即可,但如果像下面在$4变量用单引号,则还需要加上双引号才行. cat 2.txt | awk '{ print $1, $2, $3, "'\''& ...

  4. C. Journey

    C. Journey time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...

  5. String类、StringBuilder类、StringBuffer类

    String类是不可变类,创建了一个String对象后,该String对象中的字符序列不能被改变. StringBuilder是字符序列可变的字符串类,提供了一系列修改字符串的方法. StringBu ...

  6. Kendo MVVM (二) ObservableObject 对象

    概述 Kendo MVVM 框架关键的一个部分为 ViewModel,它主要是通过 kendo.data.ObserableObject 来提供支持的.它可以监控改变( UI 变化或是值的变化)并通知 ...

  7. linux 查看dd进度

    Linux下显示dd命令的进度: dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000 想要查看上面的dd命令的执行进度,可以使用下面几种方法: 比 ...

  8. 关于纠正《Hive权威指南》中的结论~“hive在使用set自定义变量时,hivevar命名空间是可选的”~的论证

    背景: 根据<Hive权威指南>上讲,在hive-0.8.0以后可以使用--define key=value命令定义用户自定义的变量以便在Hive脚本中引用.当用户使用这个功能时,Hive ...

  9. 第一篇Active Directory疑难解答概述(2)

    从故障诊断的角度来看,无论用户对象存在于哪个Active Directory域中,Exchange都需要访问此数据.这意味着所有包含启用Exchange的对象的域必须对其运行Setup / Prepa ...

  10. Python3基础02(列表和字符串处理)

    str = 'Runoob'# 输出字符串print(str) # 输出第一个到倒数第二个的所有字符print(str[0:-1]) # 输出字符串第一个字符print(str[0]) # 输出从第三 ...