一、概念

组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

二、UML图

1.Component(对象接口),定义了对象可以做的事情。

2.Leaf(叶子结点对象)

3.Composite(其他结点对象,包含其他结点或者叶子节点)

三、例子

快递公司一般都有层级结构

/**
* 顺丰公司抽象类
* 定义了公司可以做哪些事情
* @author eason
*
*/
public abstract class SFCompany { //公司名
protected String name;
//公司级别
protected int grade; public SFCompany(String name, int grade) {
this.name = name;
this.grade = grade;
} //添加一个下属公司
public abstract void add(SFCompany sf);
//删除一个下属公司
public abstract void remove(SFCompany sf);
//打印自己
public void display() {
for(int i=1; i<=grade; i++) {
System.out.print("-----");
}
System.out.println(name);
} } /**
* 最下层的公司
* @author eason
*
*/
public class SFTailCompany extends SFCompany{ public SFTailCompany(String name, int grade) {
super(name, grade);
} @Override
public void add(SFCompany sf) {
throw new UnsupportedOperationException();
} @Override
public void remove(SFCompany sf) {
throw new UnsupportedOperationException();
} // 已经提到父类中
// @Override
// public void display() {
// for(int i=1; i<=grade; i++) {
// System.out.print("-----");
// }
// System.out.println(name);
// }
} /**
* 有下属公司的顺丰公司
* @author eason
*
*/
public class SFHeadCompany extends SFCompany{
//保存下属公司
private List<SFCompany> sfCompanys = new ArrayList<SFCompany>(); public SFHeadCompany(String name, int grade) {
super(name, grade);
} @Override
public void add(SFCompany sf) {
sfCompanys.add(sf);
} @Override
public void remove(SFCompany sf) {
sfCompanys.remove(sf);
} //先打印自己,在打印自己的下属
@Override
public void display() {
// 已经提到父类中,用super.display();代替
// for(int i=1; i<=grade; i++) {
// System.out.print("-----");
// }
// System.out.println(name);
super.display();
for(SFCompany sf : sfCompanys) {
sf.display();
}
} } /**
* 测试类
* @author eason
*
*/
public class TestCompostite { public static void main(String[] args) {
SFCompany head = new SFHeadCompany("总公司", 1);
SFCompany shenzhen = new SFHeadCompany("深圳分公司", 2);
SFCompany wuhan = new SFHeadCompany("武汉分公司", 2);
SFCompany beijing = new SFHeadCompany("北京分公司", 2);
SFCompany wuchang = new SFHeadCompany("武昌分公司", 3);
SFCompany baoan = new SFHeadCompany("宝安分公司", 3);
SFCompany luohu = new SFHeadCompany("罗湖分公司", 3);
SFCompany nanshan = new SFHeadCompany("南山分公司", 3); head.add(shenzhen);
head.add(wuhan);
head.add(beijing); wuhan.add(wuchang); shenzhen.add(baoan);
shenzhen.add(luohu);
shenzhen.add(nanshan);
//移除武汉
//head.remove(wuhan); head.display(); } }

四、使用场景

1.需求中体现的是整体和部分的层次关系,以及用户希望忽略整体与部分的不同,统一的使用整体对象和部分对象时,就应该考虑组合模式。

2.组合模式让你可以优化处理递归或分级数据结构。如文件系统结构。

设计模式--组合模式Composite(结构型)的更多相关文章

  1. 组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)

    组合模式(合成模式 COMPOSITE) 意图 将对象组合成树形结构以表示“部分-整体”的层次结构. Composite使得用户对单个对象和组合对象的使用具有一致性.   树形结构介绍 为了便于理解, ...

  2. 设计模式08: Composite 组合模式(结构型模式)

    Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface I ...

  3. 浅谈设计模式--组合模式(Composite Pattern)

    组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...

  4. 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释

    组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...

  5. 设计模式组合模式(Composite)精华

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建 ...

  6. 设计模式 -- 组合模式 (Composite Pattern)

    定义: 对象组合成部分整体结构,单个对象和组合对象具有一致性. 看了下大概结构就是集团总公司和子公司那种层级结构. 角色介绍: Component :抽象根节点:其实相当去总公司,抽象子类共有的方法: ...

  7. C#设计模式——组合模式(Composite Pattern)

    一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...

  8. 合成模式(Composite)-结构型

    原理 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 有时候又叫做部分-整体 ...

  9. 设计模式-组合模式(Composite)

    一.概念 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.模式动机 组合模式,通过设计一个抽像的组件类,使它既代表叶子对象,又代表组合对 ...

随机推荐

  1. 【转】iOS,搜索标签布局

    前一阵时间,看过这样一个demo,代码不多,但是简洁易懂. 转自: //  代码地址: https://github.com/iphone5solo/PYSearch //  代码地址: http:/ ...

  2. 【原】iOS 同时重写setter和getter时候报错:Use of undeclared identifier '_name';did you mean 'name'

    写了那么多的代码了,平时也没有怎么注意会报这个错误,因为平时都很少同时重写setter和getter方法,一般的话,我们大概都是使用懒加载方法,然后重写getter方法,做一个非空判断.然后有时候根据 ...

  3. BootStrap table使用

    bootstrap table git address https://github.com/wenzhixin/bootstrap-table 引入文件 <link rel="sty ...

  4. mysqlbinlog

    一.描述 转换二进制日志为易读的文本格式或用于管道后恢复数据 二.用法 -d, --database=name 仅列出指定数据库的条目 --start-datetime=name 从指定时间开始读取事 ...

  5. sublime

    sublime的格式化快捷键 其实在sublime中已经自建了格式化按钮:Edit  ->  Line  ->  Reindent 只是sublime并没有给他赋予快捷键,所以只需加上快捷 ...

  6. JavaScript系列文章:不能不看的数据类型检测

    由于JavaScript是门松散类型语言,定义变量时没有类型标识信息,并且在运行期可以动态更改其类型,所以一个变量的类型在运行期是不可预测的,因此,数据类型检测在开发当中就成为一个必须要了解和掌握的知 ...

  7. SignalR实现网页实时聊天功能

    SignalR是利用html5 sokit方式实现网页的实时性,在客户端不支持html5的情况下通过轮询实现 实现原理是客户端发送的消息先去服务器,然后服务器根据需要将消息广播到需要接收信息的客户群. ...

  8. PHP进程通信基础——shmop 、sem系列函数使用

    PHP进程通信基础--shmop .sem系列函数使用 进程通信的原理就是在系统中开辟出一个共享区域,不管是管道也好,还是共享内存,都是这个原理.如果心中有了这个概念,就会很方便去理解代码.由于官网上 ...

  9. python模块(shelve,xml,configparser,hashlib,logging)

    1.1shelve模块 shelve 模块比pickle模块简单,只有一个open函数,返回类似字典对象,可读可写:key必须为字符串, 而值可以是python所支持的数据类型. shelve模块主要 ...

  10. android开发注意事项

    写到哪里算哪里,从新项目 说说我怎样开发 1.新建项目,创建自己的application 在Application中初始化xutils3和自己的UncaughtExceptionHandler,添加 ...