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种设计模式之结构型模式的特点和分类
结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...
随机推荐
- Codeforces #564div2 C(模拟)
要点 没想到的一点是,对于堆里的某牌,最好情况是它出来时后边都准备就绪了,答案是\(p[i] + (n - i + 1)\),所有的这个取最大的即可 一发结束的情况先特判一下 const int ma ...
- myeclipse 最佳设置
http://www.cnblogs.com/wuyifu/p/3593035.html
- js和jq中常见的各种位置距离之offset()和position()的区别(二)
offset()返回的是相对于当前文档的坐标,position()返回的是相对于其定位的祖辈元素的坐标. 使用position()方法时事实上是把该元素当绝对定位来处理,获取的是该元素相当于最近的一个 ...
- null、undefined和NaN的区别
未定义的值和定义未赋值的值是undefined: null是一种特殊的Object,可以给变量赋一个值null,来清除变量的值: NaN是一种特殊的number:
- 行框基线位置确定(line box 基线)
在设置vertical-align属性(只有inline元素有效,对inline-block和block元素无效)时有一个属性值:baseline,那么这个基线是什么,怎么确定. 这个基线就是其所在行 ...
- 帝国empirecms去除后台登陆认证码
打开文件:\e\config\config.php 找到代码 $ecms_config['esafe']['loginauth']='abc'; 把值设为空即可,即改为 $ecms_config['e ...
- ios 设置导航栏背景色
//设置导航栏背景色 如果上面的不好用 就用下面的 [self.navigationController.navigationBar setBackgroundImage:[UIImage image ...
- Jenkins系列——使用SonarQube进行代码质量检查
1.目标 之前已经写过一篇关于Jenkins和SonarQube的一篇博客<jenkins集成sonar>,本文在参考前文的基础上,做了详细的补充. 使用SonarQube进行代码质量检查 ...
- java面试题(杨晓峰)---第七讲谈谈int和integer有什么区别?
理解装箱和拆箱的过程. 对象由三部分组成:对象头,对象实例,对齐填充. 对象头:一般是十六个字节,分两部分,第一部分:哈希码,锁状态标志,线程持有的锁,偏向线程id,gc分代年龄等,第二部分是类型指针 ...
- UVA 11925 Generating Permutations 生成排列 (序列)
题意:要用一个有序的序列生成给定序列,操作有两种,一是交换前两个元素,二是把第一个元素移动到最后去. 思路有两种: 1.映射,把给定序列映射成有序的序列,然后按照同样的替换规则把有序的序列映射掉,然后 ...