热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解23种设计模式(8)组合模式

介绍组合模式(CompositePattern),又叫部分整体模式,是用于把一组相似的对象当作一个单位的对象。组合模式依据树形结构来组合

在这里插入图片描述

介绍

组合模式 (Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单位的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建来对象组的树形结构。

在这里插入图片描述

需求:

展示一个学校有多少个学校院系组成,一个学院有多少个学院,一个学院有多个系。

  • 清华大学
    • 计算机学院
      • 计算机科学与技术
      • 软件工程
    • 信息工程专业
      • 通信工程
      • 信息工程



  1. 创建 OrganizationComponent 类 该类带有 OrganizationComponent 对象

@Data
@ToString
public abstract class OrganizationComponent {/*** 说明*/private String name;/*** 说明*/private String des;/*** 添加方法* @param component*/protected void add(OrganizationComponent component){throw new UnsupportedOperationException();}/*** 删除* @param component*/protected void remove(OrganizationComponent component){throw new UnsupportedOperationException();}protected abstract void print();public OrganizationComponent(String name, String des) {this.name = name;this.des = des;}
}

  1. 创建University 学校类

public class University extends OrganizationComponent{List<OrganizationComponent> list &#61; new ArrayList<>();public University(String name, String des) {super(name, des);}&#64;Overrideprotected void add(OrganizationComponent component) {list.add(component);}&#64;Overrideprotected void remove(OrganizationComponent component) {list.remove(component);}&#64;Overrideprotected void print() {System.out.println("----"&#43;getName()&#43;"---");list.stream().forEach( component -> {component.print();});}
}

  1. 创建学院类

public class College extends OrganizationComponent{List<OrganizationComponent> list &#61; new ArrayList<>();public College(String name, String des) {super(name, des);}&#64;Overrideprotected void add(OrganizationComponent component) {list.add(component);}&#64;Overrideprotected void remove(OrganizationComponent component) {list.remove(component);}&#64;Overrideprotected void print() {System.out.println("--------"&#43;getName()&#43;"--------");list.stream().forEach( component -> {component.print();});}
}

  1. 创建专业类

public class Department extends OrganizationComponent{public Department(String name, String des) {super(name, des);}&#64;Overrideprotected void print() {System.out.println("------------"&#43;getName()&#43;"------------");}
}

  1. Client

public class Client {public static void main(String[] args) {//从大到小建立大学University university &#61; new University("清华", "985");//创建学院College college &#61; new College("计算机学院", "计算机学院");College college2 &#61; new College("信息工程学院", "信息工程学院");//添加专业college.add(new Department("计算机科学与技术","计算机科学与技术"));college.add(new Department("网络工程","网络工程"));college2.add(new Department("通信工程","通信工程"));college2.add(new Department("信息工程","通信工程"));university.add(college);university.add(college2);university.print();}
}

在这里插入图片描述

组合模式在JDK Map中使用


  • Map 就是一个抽象的构件&#xff0c;类似于组合模式中的Component&#xff1b;
  • HashMap是中间的构件&#xff0c;只不过在HashMap与Component之间多了一层AbstractMap&#xff0c;并且重写了Map中put()&#xff0c;putAll()等方法&#xff1b;
  • Node是HashMap中的静态内部类&#xff0c;类似于Leaf叶子节点

在这里插入图片描述

Map 接口 &#xff1a;顶级接口

public interface Map<K,V> {V put(K key, V value);void putAll(Map<? extends K, ? extends V> m);………………
}

AbstractMap 抽象类实现来Map接口 &#xff1a;接口实现&#xff0c;扩展

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 &#xff1a;方法实现

public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}public void putAll(Map<? extends K, ? extends V> m) {putMapEntries(m, true);}
}

HashMap中的内部类 Node &#xff1a;他其实就是我们组合模式中所讲述的Leaf对象&#xff0c;它没有再组合任何的子节点&#xff0c;提供的也只有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 &#61; hash;this.key &#61; key;this.value &#61; value;this.next &#61; next;}public final K getKey() { return key; }public final V getValue() { return value; }public final String toString() { return key &#43; "&#61;" &#43; value; }public final int hashCode() {return Objects.hashCode(key) ^ Objects.hashCode(value);}public final V setValue(V newValue) {V oldValue &#61; value;value &#61; newValue;return oldValue;}public final boolean equals(Object o) {if (o &#61;&#61; this)return true;if (o instanceof Map.Entry) {Map.Entry<?,?> e &#61; (Map.Entry<?,?>)o;if (Objects.equals(key, e.getKey()) &&Objects.equals(value, e.getValue()))return true;}return false;}}

  • Map中的HashMap是应用了组合模式来实现的




github Demo地址 : &#xff5e;&#xff5e;&#xff5e;传送门&#xff5e;&#xff5e;&#xff5e;

个人博客地址&#xff1a;http://blog.yanxiaolong.cn/


推荐阅读
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
林yong珊_450
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有