上周面试,面试官问桥接模式是什么,我就举了个例子:手机分为苹果,小米....,每个手机都有视频,游戏...等功能。直观上是一个树形结构。这种情况下,可以用桥接模式,把手机作为接口,苹果,小米等继承手机接口;再用一个手机软件接口,让视频,游戏等继承手机软件接口;在手机中保留软件指针。这样可以让具体的手机和手机软件解耦。然后面试官说,这个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组合模式的更多相关文章

  1. 设计模式(9)--Composite(组合模式)--结构型

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

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

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

  3. 一天一个设计模式——Composite组合模式

    一.模式说明 能够使容器与内容物具有一致性,创造出递归结构的模式就是Composite组合模式. 举个例子:计算机中的文件系统中有文件和文件夹的概念,我们知道,文件夹可以包含文件,也可以包含子文件夹, ...

  4. C++设计模式-Composite组合模式

    Composite组合模式作用:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. UML图如下: 在Component中声明所有用来 ...

  5. 十一、Composite 组合模式

    原理: 代码清单 Entity public abstract class Entry { public abstract String getName(); public abstract int ...

  6. java23种设计模式——八、组合模式

    目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...

  7. Composite组合模式(结构型模式)

    1.概述 在面向对象系统中,经常会遇到一些具有"容器性质"的对象,它们自己在充当容器的同时,也充当其他对象的容器. 2.案例 需要构建一个容器系统,需要满足以下几点要求: (1). ...

  8. 设计模式学习之组合模式(Composite,结构型模式)(10)

    转载地址:http://www.cnblogs.com/zhili/p/CompositePattern.html 一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系 ...

  9. 设计模式之:组合模式(Composite)

    支持原创:http://blog.csdn.net/hguisu/article/details/7530783 设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构 ...

随机推荐

  1. 【dlbook】正则化

    对学习算法的修改——旨在减少泛化误差而不是训练误差 显著减少方差而不过度增加偏差. [参数范数惩罚] 通常只对权重做惩罚而不对偏置做惩罚,原因是拟合偏置比拟合权重容易很多. 不同层使用不同惩罚的代价很 ...

  2. gradle-wrapper.properties中各属性的含义

    gradle-wrapper.properties中各属性的含义 1. gradle-wrapper.properties 每一个用gradle编译的工程,都会有一个gradle\wrapper目录. ...

  3. [置顶] kubernetes1.8发布跟踪

    一.Kubernetes发布历史回顾 1.        Kubernetes 1.0 - 2015年7月发布 2.        Kubernetes 1.1 - 2015年11月发布 3.     ...

  4. 如何实现PLC与THINGWORX工业物联网平台对接

    物联网(Internet of Things),简称 IoT,对于制造商来说,是行业乃至世界范围内的一股变革浪潮.在我们设计和制造的产品中,将会不断嵌入各种软件.传感器和启用 IP 的连接功能.IDC ...

  5. Scrapy爬虫库使用初体验

    安装pip install Scrapy 中间可能会遇到的问题: 超时,网络问题需要多次尝试 缺少vc++库,官网可以下载 win32api缺失,https://sourceforge.net/pro ...

  6. SQL基础四(例子)

    ------------------------------------------------ --分别创建student/course/score表 Create table student ( ...

  7. mysql查询慢之后

    |--缘起:早上刚一到公司就反映公司网站爆卡,线上erp完全无法使用,赶紧扔掉手中包子. --------------------------------------- |--排查:开发中会经常发现开 ...

  8. XMPP协议相关知识

    XMPP协议的组成 主要的XMPP 协议范本及当今应用很广的XMPP 扩展: RFC 3920 XMPP:核心.定义了XMPP 协议框架下应用的网络架构,引入了XML Stream(XML 流)与XM ...

  9. canvas 背景透明

    theCanvas = document.getElementById('canvasOne');var context = theCanvas.getContext('2d');context.fi ...

  10. webdriver常用函数总结

    #1 创建浏览器对象 driver = webdriver.Chrome() #2 设置隐式等待10秒 driver.implicitly_wait(10) #3 最大化浏览器窗口 driver.ma ...