目录

java23种设计模式—— 一、设计模式介绍

java23种设计模式—— 二、单例模式

java23种设计模式——三、工厂模式

java23种设计模式——四、原型模式

java23种设计模式——五、建造者模式

java23种设计模式——六、适配器模式

java23种设计模式——七、桥接模式

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

介绍

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

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

组合模式类似树形结构,上一层节点的包含多个下一层的节点,而下一层的节点只依附于一个上一层的节点。

实现

我们先来看下组合模式的角色。

  • Component抽象构建角色,抽象共有的方法和属性,
  • Leaf叶子构件,叶子对象,没有其他分支,类似于树叶
  • Composite数值构件,组合叶子和其他树枝组合成一个完整的树,类似于树枝

通常大学里都有很多个系,每个系又包含多个专业,每个专业也有多个班级。

首先有一个抽象学校类,即component角色

/**
* @author codermy
* @createTime 2020/7/28
*/
//学校
public abstract class School {
//展示树形结构
public abstract void display(String f);
//添加分支
public void add(School branch){
throw new UnsupportedOperationException("不支持此功能");
};
//删除分支
public void remove(School branch) {
// 若叶子对象没有这个功能,或子类未实现这个功能
throw new UnsupportedOperationException("不支持此功能");
} }

现在有一个Branch类(即Composite角色)继承了学校类,并实现其中方法。我们可以把它抽象的想成,学校的分院与专业的结构都一样,所以新建它们都公用这一个类

/**
* @author codermy
* @createTime 2020/7/28
* 分院
*/
public class Branch extends School {
//学校集合
private List<School> schoolList = new ArrayList<>(); private String name; public Branch(String name){
this.name=name;
} @Override
public void display(String f) {
System.out.println(f + name);
// 如果还包含其他子组件,那么就输出这些子组件对象
if (null != schoolList) {
// 添加一个空格,表示向后缩进一个空格
f += "---";
// 输出当前对象的子组件对象
for (School school : schoolList) {
// 递归地进行子组件相应方法的调用,输出每个子组件对象
school.display(f);
}
}
} public void add(School branch){
schoolList.add(branch);
} public void remove(School branch){
schoolList.remove(branch);
}
}

而学校里最小的单元是班级,新建这个类(即Leaf)

/**
* @author codermy
* @createTime 2020/7/28
*/
public class Class extends School {
private String name; public Class(String name){
this.name = name;
} @Override
public void display(String f) {
System.out.println(f + "-"+ name);
}
}

client类测试

/**
* @author codermy
* @createTime 2020/7/28
*/
public class Client {
public static void main(String[] args) {
//新建一个学校
School university = new Branch("南京大学");
//新建分院
School branch1 = new Branch("计算机与软件学院");
School branch2 = new Branch("外国语学院");
//新建专业
School profession1 = new Branch("软件工程");
School profession2 = new Branch("网络工程");
//新建班级
profession1.add(new Class("软件1801"));
profession1.add(new Class("软件1802")); branch1.add(profession1);
branch1.add(profession2);
university.add(branch1);
university.add(branch2);
university.display("-");
}
}

输出

-南京大学
----计算机与软件学院
-------软件工程
-----------软件1801
-----------软件1802
-------网络工程
----外国语学院

优缺点

优点:

  • 1、高层模块调用简单。
  • 2、节点自由增加。
  • 3、可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易。

缺点:

  • 1、在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
  • 2、使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性。

java23种设计模式——八、组合模式的更多相关文章

  1. 【Unity3D与23种设计模式】组合模式(Composite)

    前段时间在忙一个新项目 博客好久没有更新了 GoF中定义: "将对象以树状结构组合,用以表现部分-全体的层次关系.组合模式让客户端在操作各个对象或组合时是一致的." 是一致的意思就 ...

  2. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

  3. 23种设计模式之组合模式(Composite)

    组合模式又称为整体-部分(Part-whole)模式,属于对象的结构模式.在组合模式中,通过组合多个对象形成树形结构以表示整体-部分的结构层次.组合模式对单个对象(即叶子对象)和组合对象(即容器对象) ...

  4. Java--23种设计模式之decorator模式

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...

  5. java23种设计模式之四:建造者模式

    在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成.例如:在新招收一个员工时,对个人信息对象的创建,在不同的阶段,需要个人信息的内容也不一样,姓名.性别.年龄 ...

  6. java23种设计模式之一: 策略模式

    由于最近在研究学习设计模式,我会用自己的理解方式来表述对设计模式的学习和认识,通过最常用.好记的案例来记住和使用设计模式,希望对设计代码方面有所提高和改进. 一.应用背景     在软件开发中常常遇到 ...

  7. java23种设计模式之: 策略模式,观察者模式

    策略模式  --老司机开车,但是他今天想到路虎,明天想开奔驰...针对他不同的需求,来产生不同的应对策略    策略类是一个接口,定义了一个大概的方法,而实现具体的策略则是由实现类完成的,这样的目的是 ...

  8. java23种设计模式之一: 代理模式(动态代理)

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  9. java23种设计模式之五:代理模式

    一.代理模式介绍 代理模式的定义:就是为一个接品(对象)提供一个代理的对象,并由这个代理对象控制对原对象的访问流程 其中代理又分为:静态代理和动态代理 静态代理:指的是自己要写一个代理类,或者用工具生 ...

随机推荐

  1. luogu P1721 [NOI2016]国王饮水记 斜率优化dp 贪心 决策单调性

    LINK:国王饮水记 看起来很不可做的样子. 但实际上还是需要先考虑贪心. 当k==1的时候 只有一次操作机会.显然可以把那些比第一个位置小的都给扔掉. 然后可以得知剩下序列中的最大值一定会被选择. ...

  2. luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治

    LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...

  3. EC R 87 div2 D. Multiset 线段树 树状数组 二分

    LINK:Multiset 主要点一下 二分和树状数组找第k大的做法. 线段树的做法是平凡的 开一个数组实现就能卡过. 考虑如树状数组何找第k大 二分+查询来判定是不优秀的. 考虑树状数组上倍增来做. ...

  4. idea安装testng插件后,无法使用调用testng里面的类

    1.已经安装好idea的testng插件,并且应用上相关的两个插件. 2.已经导入maven仓库的testng.jar,并且重启过idea后:发现不能调用. 本人在百度很多相关资料,始终没有找到解决方 ...

  5. 为什么switch不支持long

    switch 支持的类型 在 Java 语言规范里中,有说明 switch 支持的类型有:char.byte.short.int.Character.Byte.Short.Integer.String ...

  6. 打印java系统的信息

    System.getProperties() 确定当前系统属性 Properties.list() 将获取到的信息打印到流中 public class Userone { public static ...

  7. 100% 展示 MySQL 语句执行的神器-Optimizer Trace

    在上一篇文章<用Explain 命令分析 MySQL 的 SQL 执行>中,我们讲解了 Explain 命令的详细使用.但是它只能展示 SQL 语句的执行计划,无法展示为什么一些其他的执行 ...

  8. odoo13之给模块添加自定义配置项

    配置项效果图 odoo中给系统添加配置项有两种方式, 一种是使用odoo自带的设置,在设置中添加配置项:效果如下图, 第二种是在模块中自定义一个配置项管理菜单,在菜单form视图下添加配置项:效果如下 ...

  9. demo2动态加载显示商品详情页

    /* 要求:实现 头像+昵称(多余7位用...) 商品图片(根据商品实际的图片的大小进行动态的展示.按照一定的比例进行展示.) 产品简介.产品简介在商品图片的下边.并跟随商品图片的大小进行动态的收缩或 ...

  10. Chrome自动格式化Json输出

    对JSON格式的内容进行浏览和编辑,以树形图样式展现JSON文档,并可实时编辑 安装 Chrome商店 https://chrome.google.com/webstore/detail/json-h ...