目录
- 结构型软件设计模式
- 概述
- 一、组合模式
- 动机
- 组合模式结构
- 实例一:五子棋游戏
- 实例二:空军指挥系统
- 关于组合模式的讨论
- 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( )方法。
优点:所有的构件类都有相同的接口;
缺点:不够安全。
优缺点
优点:
- 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易。
- 客户端调用简单,客户端可以一致地使用组合结构或其中单个对象。
- 定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构。
- 在组合体内加入对象构件更容易,客户端不必因为加入了新的对象构件而更改原有代码。
缺点:
- 使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联。
- 增加新构件时可能会产生一些问题,很难对容器中的构件类型进行限制。
适用环境
- 需要表示一个对象整体或部分层次,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致地对待它们。
- 让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节。
- 对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们。
课程作业
主要是组合关系,部件。component 包含 composite和部件,composite又包含部件
其中Company为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类HRDepartment和FinanceDepartment分别表示人力资源部和财务部。