设计模式之——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. 概述 在数据结构里面,树结构 ...
随机推荐
- LINUX中的DNS服务---DNS正向、反向和双向解析
一.DNS的正向解析 也就是域名解析为IP地址进行访问! 1)vim /etc/named.conf ----> 删除forwarders所在行 2)vim /etc/named.rf ...
- 慕课网-Linux达人养成计划学习笔记
mkdir -p [目录]创建目录-p 递归创建ls 查看当前目录下的文件和目录等其他文件 cd [目录]命令英文愿意:change directory切换所在目录简化操作cd ~ 进入当前用户的家目 ...
- 一个好工具-everything-可以找到浏览器的所有缓存
下载路径http://www.voidtools.com/downloads/ 我用它来寻找浏览器缓存的google瓦片.
- Visual studio 生成后事件说明
在“配置属性->生成事件->生成后事件”属性页中的“命令行”编辑框中输入如下命令: copy "$(ProjectDir)$(IntDir)\$(ProjectName).t ...
- 为Java程序员金三银四精心挑选的五十道面试题与答案
1.面向对象的特征有哪些方面? [基础] 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问 ...
- JavaScript class 使用
/********************************************************************* * JavaScript class 使用 * 说明: * ...
- Srping框架中使用@query注解实现复杂查询
[自己项目代码] @Query("select bean from User bean where bean.org.id=?1 and bean.group.id=?2") pu ...
- Yahoo关于性能优化的N条规则
本来这是个老生常谈的问题,上周自成又分享了一些性能优化的建议,我这里再做一个全面的Tips整理,谨作为查阅型的文档,不妥之处,还请指正: 一. Yahoo的规则条例: 谨记:80%-90%的终端响应时 ...
- POJ1733 Parity game 【扩展域并查集】*
POJ1733 Parity game Description Now and then you play the following game with your friend. Your frie ...
- Roslyn 语法树中的各种语法节点及每个节点的含义
使用 Roslyn 进行源码分析时,我们会对很多不同种类的语法节点进行分析.如果能够一次性了解到各种不同种类的语法节点,并明白其含义和结构,那么在源码分析的过程中将会更加得心应手. 本文将介绍 Ros ...