美文网首页
迭代器模式

迭代器模式

作者: 一毛钱 | 来源:发表于2019-03-24 18:49 被阅读0次

迭代器模式-定义

提供一种方法,按照顺序访问一个容器对象中的各个元素,而又不需要暴露该容器的内部细节(内部表示)

迭代器模式-场景

遍历容器对象,例如:数据库框架 查询数据->返回数据->封装为对象(自定义对象)->遍历(自定义迭代器变量数据库元素)

迭代器模式-角色划分

4个核心角色
角色一:Iterator(迭代器接口)->协议
作用:定义了访问遍历元素的方法(标准)

角色二:ConcreteIterator(具体迭代器)
作用:遍历具体元素方法实现

角色三:Aggregrate(容器接口)->协议
作用:定义了存储元素的方法

角色四:ConcreteAggregrate(具体容器)
作用:实现了存储元素的方法

注意:以后在框架设计或者项目开发中,你发现有遍历元素的场景,第一时间想到的就是迭代器模式.

案例

角色一:迭代器接口 OrderIteratorProtocol

protocol OrderIteratorProtocol {
    
    // 定义泛型,可以返回任意类型的数据
    associatedtype ObjType
    
    // 读取下一个元素 值
    func next() -> ObjType?
    
    //是否有下一个元素值 
    func hasNext() -> Bool
}

角色二:具体迭代器OrderAnyIteractor(封装处理数据)

class OrderAnyIteractor<T>: NSObject,OrderIteratorProtocol {
    //使用泛型
    typealias ObjType = T
    
    func next() -> T? {
        return nil
    }
    
    func hasNext() -> Bool {
        return false
    }
}

角色二: 具体迭代器 继承自上面那个OrderCorrectIterator

class OrderCorrectIterator<TypeObj>: OrderAnyIteractor<TypeObj> {

  private var array:Array<TypeObj>
  private var index:Int = 0
  
  init(array:Array<TypeObj>) {
      self.array = array;
  }
  
 
  override func next() -> TypeObj? {
       // 先判断是否有数据   有 就取出 然后返回
      if self.hasNext(){
          let result = self.array[index]
          index += 1
          return result
      } else {
          // 否则返回空  注意 给泛型定义可选值
          return nil
      }
  }
  
  // 判断是否有数据
  override func hasNext() -> Bool {
      return self.array.count != index
  }
}

角色三: 容器接口

protocol AggregrateProtocol {
    // 定义一个泛型 ,用来装载数据
    associatedtype ObjData
    // 添加数据
    func add(data:ObjData)
    // 移除数据
    func remove(index:Int) -> ObjData
    //迭代器 ,用来进行数据的操作
    func iterator() -> OrderCorrectIterator<ObjData>
}

角色四:具体的容器

class CorrectAggregrate<T>: NSObject ,AggregrateProtocol{
    
    typealias ObjData = T
    
    private var array:Array<T>
    
    init(array:Array<T>) {
        self.array = array
    }
    func add(data: T) {
        self.array.append(data)
    }
    
    func remove(index: Int) -> T {
        let data = self.array[index]
        self.array.remove(at: index)
        return data
    }
    
    func iterator() -> OrderCorrectIterator<T> {
        return OrderCorrectIterator(array: self.array)
    }
}

外部调用:

        let firstModel = OrderModel("张三","买了个表",1990)
        let secModel = OrderModel("李四","买了个衣服",2000)
        let thirdModel = OrderModel("王五","买了个裤子",2200)
        let fouthModel = OrderModel("李六","买了个裤子",2200)
        
        
        let correctAgg = CorrectAggregrate(array: Array<OrderModel>())
        correctAgg.add(data: firstModel)
        correctAgg.add(data: secModel)
        correctAgg.add(data: thirdModel)
        
        // 迭代器
        let iterator = correctAgg.iterator()
        
        let result =  correctAgg.remove(index: 1)
        print(result.name,result.message,result.price)
        
        correctAgg.add(data: fouthModel)
        while iterator.hasNext() {
            let result = iterator.next()
            print(String(describing:result?.name),String(describing:result?.message),String(describing:result?.price))
        }

相关文章

网友评论

      本文标题:迭代器模式

      本文链接:https://www.haomeiwen.com/subject/vttpvqtx.html