携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。
这里是设计模式回顾的第九篇,组合模式的相关回顾。
组合模式
1、什么是组合模式
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式是对树型数据结构的一种实现,组合模式主要由两个角色组成
- 枝结点
- 叶结点
所有的组合模式都是由一个根节点扩展出来的,每个枝结点都可以扩展出枝结点和叶结点。叶结点表示这条分支的终点,无法扩展。
iOS 中的 View 就是一个标准的组合模式。
2、组合模式用在什么地方
- 在程序中有树形结构的时候使用
- 忽略组合对象与单个对象的不同,进行统一处理的时候。
UIView 对于两者都符合,结构上属于树形结构,不管是 view 还是他的 subView 都可以进行默认的处理。
3、组合模式的使用
- 创建类,定义添加、移除和检索所有节点的方法
- 创建数组,实现添加等方法。
在这里,我暂时把枝节点和叶结点的实现合为一体,在数组个数中做判断,个数为 0 的即位叶结点。
4、总结
在自己的程序中,比较少遇到树形结构,也比较少用到组合模式,按理说不需要怎么了解,不过由于在 iOS 存在的 UIView 这种组合模式的实现,所以还是需要对他有一定的了解的。
组合模式最大的优点是他的节点可以自由增加,且调用节点方便。
5、demo
import UIKit
class Composite: NSObject {
var subComposites: NSMutableArray = {NSMutableArray()}()
var parentComposite: Composite?
func addComposite(comp:Composite){
subComposites.add(comp)
comp.parentComposite = self
}
func removeCompositeAtIndex(index:Int) {
subComposites.remove(at: index)
}
func removeComposite(comp:Composite) {
subComposites.remove(comp)
}
func removeFromParent() {
if (self.parentComposite != nil) {
self.parentComposite?.removeComposite(comp: self)
}
}
}