【设计模式】—— 组合模式Composite
前言:【模式总览】——————————by xingoo
模式意图
使对象组合成树形的结构。使用户对单个对象和组合对象的使用具有一致性。
应用场景
1 表示对象的 部分-整体 层次结构
2 忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象。
模式结构
【安全的组合模式】
这种组合模式,叶子节点,也就是单个对象不具有对象的控制功能。仅仅有简单的业务操作。

package com.xingoo.composite.safe; import java.util.ArrayList;
import java.util.List; interface Component{
Composite getCmposite();
void sampleComposite();
} class Leaf implements Component{ public Composite getCmposite() {
return null;
} public void sampleComposite() {
System.out.println("Leaf operation");
} } class Composite implements Component{ private List<Component> list = new ArrayList(); public void add(Component component){
list.add(component);
} public void remove(Component component){
list.remove(component);
} public Composite getCmposite() {
return this;
} public void sampleComposite() {
System.out.println("Composite operation");
for(Component com : list){
com.sampleComposite();
}
} }
public class Client {
public static void main(String[] args) {
Component leaf1 = new Leaf();
Component leaf2 = new Leaf();
Component composite = new Composite();
composite.getCmposite().add(leaf1);
composite.getCmposite().add(leaf2);
composite.getCmposite().sampleComposite();
}
}
执行结果
Composite operation
Leaf operation
Leaf operation
【透明的组合模式】
这种组合模式,叶子节点与组合对象具有相同的方法,外表看来毫无差异。不过叶子节点的处理方法默认为空。忽略叶子节点,与组合对象的差异性。

package com.xingoo.composite.transparent; import java.util.ArrayList;
import java.util.List; interface Component{
public void SampleOperation();
public void add(Component component);
public void remove(Component component);
public Component getComponent();
} class Leaf implements Component{
public void SampleOperation() {
System.out.println("leaf operation!");
} public void add(Component component) { } public void remove(Component component) { } public Component getComponent(){
return this;
}
} class Composite implements Component{ private List<Component> list = new ArrayList(); public void SampleOperation() {
System.out.println("composite operation!");
for(Component com : list){
com.getComponent().SampleOperation();
}
} public void add(Component component) {
list.add(component);
} public void remove(Component component) {
list.remove(component);
} public Component getComponent(){
return this;
}
}
public class Client {
public static void main(String[] args) {
Component leaf1 = new Leaf();
Component leaf2 = new Leaf();
Component leaf3 = new Leaf();
Component composite1 = new Composite();
Component composite = new Composite(); composite1.add(leaf3); composite.getComponent().add(leaf1);
composite.getComponent().add(leaf2);
composite.getComponent().add(composite1); composite.getComponent().SampleOperation();
}
}
本例中的结构层次

执行结果
composite operation!
leaf operation!
leaf operation!
composite operation!
leaf operation!
【设计模式】—— 组合模式Composite的更多相关文章
- 浅谈设计模式--组合模式(Composite Pattern)
组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...
- 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释
组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...
- 设计模式组合模式(Composite)精华
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建 ...
- 设计模式 -- 组合模式 (Composite Pattern)
定义: 对象组合成部分整体结构,单个对象和组合对象具有一致性. 看了下大概结构就是集团总公司和子公司那种层级结构. 角色介绍: Component :抽象根节点:其实相当去总公司,抽象子类共有的方法: ...
- 设计模式--组合模式Composite(结构型)
一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...
- C#设计模式——组合模式(Composite Pattern)
一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...
- 设计模式-组合模式(Composite)
一.概念 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.模式动机 组合模式,通过设计一个抽像的组件类,使它既代表叶子对象,又代表组合对 ...
- 说说设计模式~组合模式(Composite)
返回目录 何时能用到它? 组合模式又叫部分-整体模式,在树型结构中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦.对于今天这个 ...
- 大话设计模式--组合模式 Composite -- C++实现实例
1. 组合模式: 将对象组合成树形结构以表示"部分--整体"的层次结构,组合模式使用户对单个对象和组合对象的使用具有一致性. 需求中是体现部分与整体层次的结构时,希望用户可以忽略组 ...
- 设计模式(七)组合模式Composite(结构型)
设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...
随机推荐
- cocoapods 报错
1.[!] ERROR: Parsing unable to continue due to parsing error: contained in the file located at xxx/x ...
- Android 将若干张图片拼接在一起形成一个全新的图片
目的:使用Android技术将若干张图片拼接成为一张图片. 最开始的两张图如下所示: 拼接后的图片如下图所示: 这样就把两张图片拼接成为一张了. 拼接步骤: 1.使用Bitmap创建一个空的Bitma ...
- ceph存储osd启动异常处理和正常启停操作
机器角色:cloudstack虚拟机的宿主机:ceph存储机器. 事件:ceph存储的物理机器由于内存异常,需要停机更换,仅仅是把该物理机上面的虚拟机迁移走,同时启动了停机维护,然后就直接关机.结果造 ...
- win7中mysql安装
最近需要用到MySQL,从官网上下载了一个安装文件,但是安装时一直弹出如下提示信息: Configuration of MySQL Server 5.7 is taking longer than e ...
- 十万的License只取决于一个连接
前段时间看到一份代码,小规模.低难度的一个应用,MVC用到极致,业务逻辑却混成一团麻,应该是中了培训班的毒.现在的程序员,大多是没仔细读过<现代操作系统>,没看过编译原理,不知道堆与栈,没 ...
- C++和python的变量对比
<C++中的this和Python的self对比>基本都是针对函数而言的,从变量的角度看,也有相同之处. C++中,类中定义的变量一般叫做成员变量,或者说是成员属性,它只属于实例对象,只有 ...
- Scala学习(一)练习
Scala基础学习&l练习 1. 在Scala REPL中键人3.,然后按Tab键.有哪些方法可以被应用 在Scala REPL中需要按3. 然后按Tab才会提示. 直接按3加Tab是没有提示 ...
- libgdx学习记录12——圆角矩形CircleRect
libgdx提供了ShapeRenderer这个工具,用它可以画点.画线.画圆.画矩形.画椭圆.画扇形,但是没有提供画圆角矩形的方法. 刚开始自己尝试分成8端,4端画直线,4端画扇形,发现多了半径几部 ...
- Flask学习-前言
前言 使用Flask断断续续加起来快一年了,但是一直没有从源码层去了解其实现原理.加上自己python基础不扎实,所以准备从看一个开源项目开始,希望能够从中窥得武功精髓,让自己水平更上一层楼. Fla ...
- 同步、异步、回调执行顺序之经典闭包setTimeout分析
聊聊同步.异步和回调 同步,异步,回调,我们傻傻分不清楚, 有一天,你找到公司刚来的程序员小T,跟他说:“我们要加个需求,你放下手里的事情优先支持,我会一直等你做完再离开”.小T微笑着答应了,眼角却滑 ...