组合模式

1.基本介绍

  • 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系
  • 组合模式依据树形结构来组合对象,用来表示部分以及整体层次,属于结构性模式
  • 组合模式使得用户对单个对象和组合对象的访问具有一致性(组合模式能让用户以一致的方式处理个别对象以及组合对象)

2.原理类图

  • Component:这是组合中对象的声明接口或者抽象类,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理Component的子部件
  • Leaf:在组合中表示叶子节点,叶子节点没有子节点
  • Composite:非叶子节点,用于存储子部件,在Component接口或抽象类中实现字部件的相关操作

3.案例

  • 院校结构展示

实现类图

  • University属于最高一级,Department属于叶子节点

代码实现

抽象类的设计

public abstract class OrganizationComponent {private String name;private String des;//默认实现,因为叶子节点不需要实现protected void add(OrganizationComponent organizationComponent) {throw new UnsupportedOperationException();}protected void remove(OrganizationComponent organizationComponent) {throw new UnsupportedOperationException();}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDes() {return des;}public void setDes(String des) {this.des = des;}public OrganizationComponent(String name, String des) {super();this.name = name;this.des = des;}//子类实现public abstract void print()
}

Univresity类

public class University extends OrganizationComponent{//管理子节点List<OrganizationComponent> organizations = new ArrayList<>();public University(String name, String des) {super(name, des);}@Overridepublic void print() {System.out.println("============"+getName()+"==============");for(OrganizationComponent organizationComponent : organizations) {organizationComponent.print();}}@Overrideprotected void add(OrganizationComponent organizationComponent) {organizations.add(organizationComponent);}@Overrideprotected void remove(OrganizationComponent organizationComponent) {organizations.remove(organizationComponent);}
}

其余非叶子节点

public class College extends OrganizationComponent{List<OrganizationComponent> organizations = new ArrayList<>();public College(String name, String des) {super(name, des);// TODO Auto-generated constructor stub}@Overridepublic void print() {System.out.println("============"+getName()+"==============");for(OrganizationComponent organizationComponent : organizations) {organizationComponent.print();}}@Overrideprotected void add(OrganizationComponent organizationComponent) {//按需求扩展organizations.add(organizationComponent);}@Overrideprotected void remove(OrganizationComponent organizationComponent) {organizations.remove(organizationComponent);}
}

叶子节点

public class Department extends OrganizationComponent{public Department(String name, String des) {super(name, des);// TODO Auto-generated constructor stub}@Overridepublic void print() {System.out.println(getName());}
}

构建树型结构以及调用

public class Client {public static void main(String[] args) {University university = new University("清华大学","国内最好的大学之一");College college1 = new College("计算机学院", "计算机学院");College college2 = new College("信息工程学院", "信息工程学院");college1.add(new Department("软件工程", "软件工程"));college1.add(new Department("网络工程", "网络工程"));college1.add(new Department("计算机科学与技术", "计算机科学与技术"));college2.add(new Department("通信工程", "通信工程"));university.add(college1);university.add(college2);university.print();}
}

4.JDK中Map的组合模式

1.使用类图分析

  • 可以看到Map和AbstractMap是属于我们说的组合模式中的Component对象,声明方法的接口或者抽象类
  • HashMap其子类,属于子节点的类,用于存储子部件
  • Node是HashMap的内部类,从源码可以发现他就是我们组合模式中讲述的Leaf节点,他只有get,set功能
  • 如上大致可以看出这是一个组合模式,接下来我们用源码来看看

2.源码分析

  • 先看到Map接口,可以看到定义的众多方法中有两个我们常用的方法,put(),putAll(),他将被实现

    public interface Map<K,V> {………………V put(K key, V value);void putAll(Map<? extends K, ? extends V> m);………………
    }
    
  • 接着来到AbstractMap,它实现了Map接口,由于Map的实现类会有很多,所以jdk中使用这个抽象类来作为缓冲类,将一些方法默认实现,使得该接口更具有扩展性,如下它默认实现了put()和putAll()

    public abstract class AbstractMap<K,V> implements Map<K,V> {……………………//默认实现public V put(K key, V value) {throw new UnsupportedOperationException();}public void putAll(Map<? extends K, ? extends V> m) {for (Map.Entry<? extends K, ? extends V> e : m.entrySet())put(e.getKey(), e.getValue());}……………………
    }
    
  • 然后我们来到最常用HashMap类中,可以看到它对接口和抽象类都进行了实现,发现了还有一个Node对象

    public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {……………………//来到put方法,看到这里进行了具体的实现public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}//这里省略具体的操作,我们只关心设计模式,putAll也与put方法类似,就不讲述了,之后会再写一些关于java集合类的具体实现final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {//这里用到了一个Node对象,我们进入到Node对象中观察Node<K,V>[] tab; Node<K,V> p; int n, i;………………………………}
    }
    
  • 来到HashMap的内部类Node对象中,我们发现,他其实就是我们组合模式中所讲述的Leaf对象,它没有再组合任何的子节点,提供的也只有get方法和set方法

     static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;V value;Node<K,V> next;Node(int hash, K key, V value, Node<K,V> next) {this.hash = hash;this.key = key;this.value = value;this.next = next;}public final K getKey()        { return key; }public final V getValue()      { return value; }public final String toString() { return key + "=" + value; }public final int hashCode() {return Objects.hashCode(key) ^ Objects.hashCode(value);}public final V setValue(V newValue) {V oldValue = value;value = newValue;return oldValue;}public final boolean equals(Object o) {if (o == this)return true;if (o instanceof Map.Entry) {Map.Entry<?,?> e = (Map.Entry<?,?>)o;if (Objects.equals(key, e.getKey()) &&Objects.equals(value, e.getValue()))return true;}return false;}}
  • 如上,我们可以清晰地看出来,Map中的HashMap是应用了组合模式来实现的

5.小结

  • 简化客户端操作,客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题
  • 具有较强的扩展性,我们组合对象时,只需要调整内部的层次关系
  • 方便创建出复杂的层次关系,客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构
  • 组合模式适用于遍历组织机构的场景以及需要复杂的树形结构
  • 要求较高的抽象性,如果节点和叶子有很多差异的话,不适合使用组合模式

可以实现树形结构的设计模式(组合模式)相关推荐

  1. 树形结构的处理——组合模式(五)

    11.5 公司组织结构 在学习和使用组合模式时,Sunny软件公司开发人员发现树形结构其实随处可见,例如Sunny公司的组织结构就是"一棵标准的树",如图11-8所示: 图11-8 ...

  2. 树形结构的处理——组合模式(二)

    11.2 组合模式概述 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)并调用执行,牵一而动百,其中使用了 ...

  3. 树形结构的处理——组合模式(三)

    11.3  完整解决方案 为了让系统具有更好的灵活性和可扩展性,客户端可以一致地对待文件和文件夹,Sunny公司开发人员使用组合模式来进行杀毒软件的框架设计,其基本结构如图11-5所示: 图11-5  ...

  4. 树形结构的处理——组合模式(四)

    11.4  透明组合模式与安全组合模式 通过引入组合模式,Sunny公司设计的杀毒软件具有良好的可扩展性,在增加新的文件类型时,无须修改现有类库代码,只需增加一个新的文件类作为AbstractFile ...

  5. js设计模式——组合模式

    组合模式将对象组合成树形结构,以表示"部分-整体"的层次结构.除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,是的用户对单个对象和组合对象的使用具有一致性. ...

  6. 设计模式 | 组合模式及典型应用

    本文的主要内容: 介绍组合模式 示例 组合模式总结 源码分析组合模式的典型应用 java.awt中的组合模式 Java集合中的组合模式 Mybatis SqlNode中的组合模式 组合模式 树形结构不 ...

  7. 设计模式之禅之设计模式-组合模式

    一:组合模式的定义         --->组合模式(Composite Pattern)也叫合成模式,有时又叫做部分-整体模式(Part-Whole),主要是用来描述部分与整体的关系      ...

  8. 设计模式 - 组合模式

    1.前言 在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣服与衣柜.以及厨房中的锅碗瓢盆等.在软件 ...

  9. Java设计模式 —— 组合模式(Composite)

    Java设计模式 -- 组合模式(Composite) 定义 Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. ...

  10. javascript设计模式-组合模式

    1 <!DOCTYPE HTML> 2 <html lang="en-US"> 3 <head> 4 <meta charset=&quo ...

最新文章

  1. 李俊君信电保研面试发言稿及其分析总结
  2. 算法-----买卖股票的最佳时机(Java 版本)
  3. 上天探索脉冲星,下海保护白海豚,腾讯这个AI团队,今年真的有点忙
  4. java mutilcatch_Java 7异常新特性之mutilcatch
  5. HTML 中的特殊字符
  6. Flowable 数据库表结构 ACT_RU_TASK
  7. android package.xml,Android自动化编译设置AndroidManifest.xml中package值(包名)
  8. WebLogic 控制台乱码
  9. CRT中的sftp上传文件出现中文路乱码
  10. 就业管理系统【软件建模与分析UML课设】
  11. 论文投稿指南——计算机领域核心期刊
  12. UBUNTU快速回到桌面
  13. [pip安装]There was a problem confirming the ssl certificate
  14. 华硕的电脑装linux系统安装教程,华硕笔记本电脑一键重装系统详细教程
  15. Aleo提高高算力的解决方法(精选)
  16. 指法练习软件需求说明书
  17. (十)MySQL中的逻辑条件 优先规则 排序(未完版)
  18. 傲慢的上校的fragment讲解
  19. 算法的最坏情况与最佳情况
  20. 人在回路的数据准备技术研究进展

热门文章

  1. 计算机图形学立方体旋转代码,Flash AS教程:旋转立方体
  2. 学会Python开发的第一步:写一个桌面小程序
  3. 微博 用户画像_微博的用户画像是怎样构建的
  4. python用户画像_研究用户应该从哪几个维度去构建用户画像模型?
  5. 链家二手房销售数据分析
  6. Python 离线安装 Extension Packages
  7. java+sql+用户登录失败,java.sql.SQLException:用户'sa'登录失败
  8. Win10微信打不开小程序,其他程序出现找不到HID.DLL的解决办法
  9. pcie link/lane number negotiation
  10. laravel-excel 3 导出(多图片导出)