iOS设计模式之组合模式

70 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情


设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。

这里是设计模式回顾的第九篇,组合模式的相关回顾。

组合模式

1、什么是组合模式

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式是对树型数据结构的一种实现,组合模式主要由两个角色组成

  1. 枝结点
  2. 叶结点

所有的组合模式都是由一个根节点扩展出来的,每个枝结点都可以扩展出枝结点和叶结点。叶结点表示这条分支的终点,无法扩展。
iOS 中的 View 就是一个标准的组合模式。

2、组合模式用在什么地方

  • 在程序中有树形结构的时候使用
  • 忽略组合对象与单个对象的不同,进行统一处理的时候。

UIView 对于两者都符合,结构上属于树形结构,不管是 view 还是他的 subView 都可以进行默认的处理。

3、组合模式的使用

  1. 创建类,定义添加、移除和检索所有节点的方法
  2. 创建数组,实现添加等方法。

在这里,我暂时把枝节点和叶结点的实现合为一体,在数组个数中做判断,个数为 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)
        }
    }
}