设计模式之——Composite组合模式
上周面试,面试官问桥接模式是什么,我就举了个例子:手机分为苹果,小米....,每个手机都有视频,游戏...等功能。直观上是一个树形结构。这种情况下,可以用桥接模式,把手机作为接口,苹果,小米等继承手机接口;再用一个手机软件接口,让视频,游戏等继承手机软件接口;在手机中保留软件指针。这样可以让具体的手机和手机软件解耦。然后面试官说,这个case可以用组合模式。我就说不知道组合模式。回来看了一下组合模式。
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。重点是理解清楚“部分/整体”还有“单个对象”和“组合对象”的含义。在树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样处理复杂元素,从而使得客户程序与复杂元素的内部解耦。
角色:
1:Component 是组合中的对象声明接口,在适当的情况下,实现所有类公有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2:Leaf 在组合中表示叶子节点对象,叶子节点没有子节点。
3:Composite定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如add和remove等。

应用场景:
1:想表示对象的部分-整体层次结构。
2:希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
经典案例:系统目录结构,网站导航结构,文件系统。
代码示意:做一套办公管理系统,并且总公司的人力资源部、财务部等的办公挂历功能在所有的分公司都有。

// 公司的抽象类或接口(Component)
public abstract class Company {
protected String name;
public Company(String name)
{
this.name = name;
}
public abstract void add(Company company);
public abstract void remove(Company company);
public abstract void display(int depth);
public abstract void lineofDuty();
}
// 具体公司类,是树枝节点(Composite)
import java.util.ArrayList;
import java.util.List;
public class ConcreteCompany extends Company {
private List<Company> childrenCompany = new ArrayList<Company>();
public ConcreteCompany(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void add(Company company) {
childrenCompany.add(company);
}
@Override
public void remove(Company company) {
childrenCompany.remove(company);
}
@Override
public void display(int depth) {
}
@Override
public void lineofDuty() {
}
}
// 财务部和人力资源部门(leaf)
public class FinanceDepartment extends Company {
public FinanceDepartment(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void add(Company company) {
}
@Override
public void remove(Company company) {
}
@Override
public void display(int depth) {
}
@Override
public void lineofDuty() {
System.out.println(name + " 负责公司财务收支管理");
}
}
public class HRDepartment extends Company {
public HRDepartment(String name) {
super(name);
}
@Override
public void add(Company company) {
}
@Override
public void remove(Company company) {
}
@Override
public void display(int depth) {
}
@Override
public void lineofDuty() {
System.out.println(name + " 负责员工招聘管理培训");
}
}
// 测试类
public class CompositePatternDemo {
public static void main(String[] args) {
// 一个总公司,包含HR部门和财务部门
ConcreteCompany root = new ConcreteCompany("北京总公司");
root.add(new HRDepartment("总公司人力资源部"));
root.add(new FinanceDepartment("总公司财务部"));
//2个子公司,每个子公司都有HR部门和财务部门
ConcreteCompany com1 = new ConcreteCompany("广州分公司");
com1.add(new HRDepartment("广州分公司人力资源部"));
com1.add(new FinanceDepartment("广州分公司财务部"));
root.add(com1);
ConcreteCompany com2 = new ConcreteCompany("杭州分公司");
com2.add(new HRDepartment("杭州分公司人力资源部"));
com2.add(new FinanceDepartment("杭州分公司财务部"));
root.add(com2);
}
}
总结:
优点: 节点可以自由增加。
客户调用简单,统一的方式调用。
缺点: 叶子(leaf)和树枝节点(Composite)都是实现类,而不是接口,违反了依赖倒置原则。
设计模式之——Composite组合模式的更多相关文章
- 设计模式(9)--Composite(组合模式)--结构型
1.模式定义: 组合模式属于对象的结构模式,有时又叫做“部分——整体”模式.组合模式将对象组织到树结构中,可以用来描述整体与部分的关系.组合模式可以使客户端将单纯元素与复合元素同等看待. 2.模式特点 ...
- 设计模式08: Composite 组合模式(结构型模式)
Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface I ...
- 一天一个设计模式——Composite组合模式
一.模式说明 能够使容器与内容物具有一致性,创造出递归结构的模式就是Composite组合模式. 举个例子:计算机中的文件系统中有文件和文件夹的概念,我们知道,文件夹可以包含文件,也可以包含子文件夹, ...
- C++设计模式-Composite组合模式
Composite组合模式作用:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. UML图如下: 在Component中声明所有用来 ...
- 十一、Composite 组合模式
原理: 代码清单 Entity public abstract class Entry { public abstract String getName(); public abstract int ...
- java23种设计模式——八、组合模式
目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...
- Composite组合模式(结构型模式)
1.概述 在面向对象系统中,经常会遇到一些具有"容器性质"的对象,它们自己在充当容器的同时,也充当其他对象的容器. 2.案例 需要构建一个容器系统,需要满足以下几点要求: (1). ...
- 设计模式学习之组合模式(Composite,结构型模式)(10)
转载地址:http://www.cnblogs.com/zhili/p/CompositePattern.html 一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系 ...
- 设计模式之:组合模式(Composite)
支持原创:http://blog.csdn.net/hguisu/article/details/7530783 设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构 ...
随机推荐
- continue的作用
特别有用,用于循环中-跳过不满足某个条件的某轮循环continue后面的语句
- three.js入门系列之光和阴影
初中物理教过我们镜面反射和漫反射,这是由于物体的材质直接导致的. 在three.js中,由于物体的材料不同,对于光源的反应也是不一样的,下面就让我们一探究竟. 一.材料 据Three.js中描述,有两 ...
- ubuntu maven install&config
可以通过命令直接安装,我还是用文件安装. 1,下载apache-maven-3.5.0-bin.tar.gz二进制压缩文件 https://maven.apache.org/download.cgi ...
- 《Effective Java》读书笔记(一)之创建和销毁对象
最近在研读<Effective Java>一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记. 郑重声明: 由于是<Effective Java>一书的 ...
- Java面试题收集以及参考答案(100道)
不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...
- java面试题大纲
跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的 ...
- ubuntu创建Centos7镜像&&配置运行环境
1. 下载centos7镜像 sudo docker pull centos:7 2. 启动centos7容器并挂载本地目录 sudo docker -it -v /home/software:/ho ...
- JS修改标签中的文本且不影响其中标签
/********************************************************************* * JS修改标签中的文本且不影响其中标签 * 说明: * ...
- OK335x mksd.sh hacking
#! /bin/sh # mk3PartSDCard. # Licensed under terms of GPLv2 # 参考文档: # . sfidsk创建可启动分区问题 # http://seg ...
- CentOS 7.4搭建Kubernetes 1.8.5集群
环境介绍 角色 操作系统 IP 主机名 Docker版本 master,node CentOS 7.4 192.168.0.210 node210 17.11.0-ce node CentOS 7.4 ...