GoF23种设计模式之结构型模式之组合模式
一、概述
将对象组合成树型结构以表示“部分--整体”的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、适用性
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种设计模式之结构型模式的特点和分类
结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...
随机推荐
- 2017 Multi-University Training Contest - Team 7 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意:一次操作就是i从1~n有 A[i]=A[i]^A[i-1]^A[i-2]...^A[1] 那么这样操 ...
- 洛谷 P3676 小清新数据结构题
https://www.luogu.org/problemnew/show/P3676 这题被我当成动态dp去做了,码了4k,搞了一个换根的动态dp #include<cstdio> #i ...
- codeforces540E-树状数组求逆序对
1-1e9的数据范围 但有1e5个区间 所以可以考虑把没有涉及到的区间缩成一个点 然后树状数组求逆序对 #include<bits/stdc++.h> #define inf 0x3f3f ...
- 矩形面积并-扫描线 线段树 离散化 模板-poj1151 hdu1542
今天刚看到这个模板我是懵逼的,这个线段树既没有建树,也没有查询,只有一个update,而且区间成段更新也没有lazy标记....研究了一下午,我突然我发现我以前根本不懂扫描线,之所以没有lazy标记, ...
- Java微信公众平台开发(十二)--微信JSSDK的使用
在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置],但是我们在真正的使用中我们不仅仅只是为了配置Config而已,而是要在我们的项目中真正去使用微信JS- ...
- ABAP数据类型
数据类型表: 类型缩写 类型 默认长度 允许长度 初始值 描述 C 文本型 1 Space 字符串数据,如'Program' D 日期型 8 8 '00000000' 日期数据,格式为YYYYMM ...
- 机器学习经典算法之SVM
SVM 的英文叫 Support Vector Machine,中文名为支持向量机.它是常见的一种分类方法,在机器学习中,SVM 是有监督的学习模型. 什么是有监督的学习模型呢?它指的是我们需要事先对 ...
- 使 windows 无需输入开机密码自动进入系统
步骤 运行netplwiz: 勾去图中所示复选框,确定后输入密码.
- 使用Java connector消费ABAP系统的函数
Java Connector(JCO)环境的搭建:Step by step to download and configure JCO in your laptop 我的ABAP系统有个函数名叫ZDI ...
- UVA208 Firetruck 消防车(并查集,dfs)
要输出所有路径,又要字典序,dfs最适合了,用并查集判断1和目的地是否连通即可 #include<bits/stdc++.h> using namespace std; ; int p[m ...