软件设计模式与体系结构-设计模式-结构型软件设计模式-组合模式

结构型软件设计模式

概述

  1. 动机
    结构型软件设计模式的主要目的是将不同的类和对象组合在一起,形成更大或者更复杂的结构体
  2. 内容
    组合模式将一个或者多个相似的对象构成组合对象。
    适配器模式提供一种机制改变原来不适合使用的接口。
    外观模式新建一个外观类,通过调用原有的类库中众多的类的方式,实现外观类的所有方法。

一、组合模式

动机

在这里插入图片描述
组合模式:组合多个对象形成树形结构以表示“整体-部分”的结构层次。组合模式对单个对象(即叶子对象) 和 组合对象(即容器对象) 的 使用具有一致性

组合模式又可以称为“整体-部分”模式

组合模式结构

在这里插入图片描述

实例一:五子棋游戏

在这里插入图片描述
在这里插入图片描述

另外,还有两个辅助类,一个类是棋子图形类GChessPiece,其对象代表一个实际的棋子图像,该图像可以被添加到棋盘Board对象上;另外一个辅助类为GameOperations类,该类提供判断棋局结果的一些矩阵方法。

实例二:空军指挥系统

在这里插入图片描述
在这里插入图片描述

同时,按照飞机类型设计了4个抽象类Fighter、Bomber、Transporter与EPlane。
每个抽象类下面都有相应的子类,子类为具体的机种。Squadron、Group类被设计成Composite类AirUnit的子类。
AirUnit类封装了数据类型ArrayList,该类型为具有弹性长度的List,在里面可以装在各种类型的对象。

关于组合模式的讨论

1. 安全形式的组合模式

安全形式的组合模式:在Composite类中声明所有的用来管理子类对象的方法,包括add( )、remove( )以及getChild( )方法,而在Component接口和树叶类型的对象中不包含管理子类对象的方法。

优点:安全;
缺点:Component层次结构类的超类与组合子类的接口不一致

在这里插入图片描述

2. 透明形式的组合模式

透明形式的组合模式:在Component类中声明所有的用来管理子类对象的方法,包括add( )、remove( ),以及getChild( )方法。

优点:所有的构件类都有相同的接口
缺点:不够安全。

在这里插入图片描述

优缺点

优点:

  1. 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易。
  2. 客户端调用简单客户端可以一致地使用组合结构或其中单个对象
  3. 定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构。
  4. 在组合体内加入对象构件更容易,客户端不必因为加入了新的对象构件而更改原有代码。

缺点:

  1. 使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联。
  2. 增加新构件时可能会产生一些问题,很难对容器中的构件类型进行限制

适用环境

  1. 需要表示一个对象整体或部分层次,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致地对待它们。
  2. 让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节
  3. 对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们

课程作业

主要是组合关系,部件。component 包含 composite和部件,composite又包含部件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

其中Company为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类HRDepartment和FinanceDepartment分别表示人力资源部和财务部。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VengaZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值