一、概述
将对象组合成树型结构以表示“部分--整体”的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、适用性
1.你想表示对象的部分--整体层次结构的时候。
2.你希望用户忽略组合对象与单个对象的不同的时候,用户将统一地使用组合结构中的所有对象。
三、参与者
1.Component:为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并且在适当的情况下实现它。
2.Leaf:在组合中表示叶节点对象,叶节点没有子节点。在组合中定义节点对象的行为。
3.Composite:定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。
4.Client:通过Component接口操作组合部件的对象。
四、类图
五、示例
Component
- package cn.lynn.composite;
- import java.util.List;
- public abstract class Saint {
- private String name;
- protected List<Saint> saints;
- public List<Saint> getSaints() {
- return saints;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void printInfo() {
- System.out.println(name);
- }
- protected abstract void obtain(Saint saint);
- protected abstract void deprive(Saint saint);
- }
Leaf
- package cn.lynn.composite;
- public class BronzeSaint extends Saint {
- public BronzeSaint(String name) {
- super.setName(name);
- super.saints = null; // 青铜圣斗士已经是最低级的
- }
- @Override
- public void obtain(Saint saint) {
- }
- @Override
- public void deprive(Saint saint) {
- }
- }
- package cn.lynn.composite;
- public class SilverSaint extends Saint {
- public SilverSaint(String name) {
- super.setName(name);
- super.saints = null; // 白银圣斗士比青铜圣斗士强点
- }
- @Override
- public void obtain(Saint saint) {
- }
- @Override
- public void deprive(Saint saint) {
- }
- }
Composite
- package cn.lynn.composite;
- import java.util.ArrayList;
- public class GoldSaint extends Saint {
- public GoldSaint(String name) {
- super.setName(name);
- super.saints = new ArrayList<Saint>(); // 还是黄金圣斗士牛逼,竟然会修圣衣
- }
- @Override
- public void obtain(Saint saint) {
- super.saints.add(saint);
- }
- @Override
- public void deprive(Saint saint) {
- super.saints.remove(saint);
- }
- }
Client
- package cn.lynn.composite;
- import java.util.List;
- public class Client {
- public static void main(String[] args) {
- Saint goldSaint = new GoldSaint("穆先生");
- Saint silverSaint = new SilverSaint("魔铃");
- Saint bronzeSaint1 = new BronzeSaint("星矢");
- Saint bronzeSaint2 = new BronzeSaint("一辉");
- Saint bronzeSaint3 = new BronzeSaint("紫龙");
- goldSaint.obtain(silverSaint);
- goldSaint.obtain(bronzeSaint1);
- goldSaint.obtain(bronzeSaint2);
- goldSaint.obtain(bronzeSaint3);
- StringBuffer sb = new StringBuffer();
- sb.append(goldSaint.getName()+"指导");
- List<Saint> saints = goldSaint.getSaints();
- for (Saint saint : saints) {
- sb.append(saint.getName());
- sb.append("、");
- }
- sb = sb.deleteCharAt(sb.length() - 1);
- sb.append("修圣衣!");
- System.out.println(sb.toString());
- }
- }
Result
- 穆先生指导魔铃、星矢、一辉、紫龙修圣衣!
GoF23种设计模式之结构型模式之组合模式的更多相关文章
-
GoF23种设计模式之结构型模式之桥接模式
一.概述 将类的抽象部分与实现分部分离开来,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和实现之间有一个固定的绑定关系的时候.例如:在程序运行时实现部分应可以被选择或切换. ...
-
GoF23种设计模式之结构型模式之外观模式
一.概述 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口的时候.子系统 ...
-
GoF23种设计模式之结构型模式之代理模式
一.概述 为其他对象提供一种代理以控制对这个对象的访问. 二.适用性 1.远程代理(RemoteProxy):为一个对象在不同的地址空间土工局部代表. 2.虚代理(VirtualProxy):根据需要 ...
-
GoF23种设计模式之结构型模式之享元模式
一.概述 运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...
-
GoF23种设计模式之结构型模式之适配器模式
一.概述 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,但是它的接口不符合 ...
-
GoF23种设计模式之结构型模式之装饰模式
一.概述 动态地给一个对象添加一些额外的职责.装饰模式比生成子类更为灵活. 二.适用性 1.在不影响其他对象的情况下,以动态.透明的方式给但个对象添加职责. 2.处理那些可以撤销的职责. 3.当不能采 ...
-
Go语言实现的23种设计模式之结构型模式
摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...
-
Java经典23种设计模式之结构型模式(一)
结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...
-
GoF的23种设计模式之结构型模式的特点和分类
结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...
随机推荐
-
Logistic回归分类算法原理分析与代码实现
前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...
-
鼠标经过图片时变换的两种方法--css+div及javascript应用
javascript方式: 熟悉使用document.getElementById()取得节点对象 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTM ...
-
jquery拖拽效果
<!doctype html><html lang="en"><head> <meta charset="utf-8" ...
-
好久没用IJ写Java 之 《求输入的一个数中包含奇数、偶数、零的个数》
/** *Created by xuzili at 22:12 on 2018/4/4 */ // 以上注释使用了IntelliJ Idea的File-Settings-Editor-Live Tem ...
-
Python:Day55 ORM多表操作
命令行创建UTF8数据库: CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 创建多表(外键)
-
Jmeter对jar包的调用赋值
一.前言 在我们测试接口的过程中,可能有时需要用到第三方jar包来生成一些测试数据(如有时需要对参数的输入值使用第三方jar包进行加密操作),涉及到这种的情况,普遍做法是:手动调用jar包获得需要的值 ...
-
JMeter与WireShark
最近在学习JMeter,刚学了一点皮毛,就掉入了WireShark的坑,我发现在学习的道路上就是不断的给自己挖坑,之前在学习LoadRunner的道路上,遇到的坑更大,就单纯的安装LR就耗费了两个星期 ...
-
摘: VS2010 C++ 调用 DLL (C++编写)
一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用. 比较常见的例子是各种应用程序框架,如ATL. ...
-
《python基础教程(第二版)》学习笔记 文件和素材(第11章)
<python基础教程(第二版)>学习笔记 文件和素材(第11章) 打开文件:open(filename[,mode[,buffering]]) mode是读写文件的模式f=open(r' ...
-
select函数与stdio混用的不良后果 (转)
出自:http://www.cppblog.com/mysileng/archive/2013/01/15/197284.html 今天在看UNP6.5节,学习到了select与stdio混用的后果. ...