一、概述

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

二、适用性

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. 长春理工大学第十四届程序设计竞赛(重现赛)F.Successione di Fixoracci

    链接:https://ac.nowcoder.com/acm/contest/912/F 题意: 动态规划(Dynamic programming,简称dp)是一种通过把原问题分解为相对简单的子问题的 ...

  2. PHP全国省市区地址分割提取脚本程序

    github地址: https://github.com/zmxfree/addressapart 比如将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号,方便excel操作 ...

  3. https://www.safaribooksonline.com/home/

    https://www.safaribooksonline.com/home/ https://www.safaribooksonline.com/library/view/instant-sikul ...

  4. Tkinter 的三大布局管理器 pack、grid 和 place用法汇总

    学习python的tkinter免不了要对各个组件进行位置的排放与设定,常用的布局管理器有grid,pack和place.这三种均用于同一父组件下的组件布局,但是也是有区别的,先看下他们各自的含义吧. ...

  5. 关于企业邮箱无法提醒解决办法(未安装邮件客户端可添加至网易邮箱大师/qq邮箱等)

    关于企业邮箱无法提醒解决办法: 一.使用现有的邮箱客户端,以下以网易的邮箱大师为例mail.exe 点击客户端左边的添加邮箱账号,在出现的对话框中输入账号和密码后,点击登陆按钮后,等待添加完成即可,邮 ...

  6. easyUI filebox限定文件大小

    转载自:https://www.2cto.com/kf/201701/574667.html 侵删  easyui1.5filebox控件中增加文件大小的验证规则 2017-01-07 09:22:0 ...

  7. css经典布局之双飞翼

    经典的两个布局方式有圣杯布局和双飞翼布局,圣杯布局主要用在国外,双飞翼布局是淘宝的UED团队开发的,优化了圣杯布局.   主要解决页面分不同列显示的问题,   一般只做页面的时候,我们分三部分,左边, ...

  8. 9、调整数组顺序使奇数位于偶数前面------------>剑指offer系列

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路 首先寻找第一个 ...

  9. ABAP:parameters的用法

    parameters 1.基础用法 parameters:p0(20) type c. 2.使用DEFAULT后缀为参数指定缺省值. parameters:p1(20) type c default ...

  10. 阿里开发搜索(OpenSearch)的学习与使用

    概述: 开放搜索(OpenSearch)是一款结构化数据搜索托管服务,为移动应用开发者和网站站长提供简单.高效.稳定.低成本和可扩展的搜索解决方案. OpenSearch基于阿里巴巴自主研发的大规模分 ...