迭代器模式:设计模式系列(十五)

  迭代器模式(Iterator Pattern):是一种让某种集合在不暴露内部细节的前提下访问各个元素的设计模式,归类为行为型模式。

  这一模式的解读分为以下几个方面:

  • 集合内部细节没有暴露。
  • 能逐一访问集合中的元素。

  使用迭代器模式的思考过程如下:

  1. 需要访问一集合实现类实例对象中的元素,但此集合内部情况如何并不清楚。
  2. 创建一迭代器类,使其能完成逐个访问集合的功能。

  明确一下结构,迭代器模式结构包括集合实现类、结合实现类抽象出来的接口或协议、迭代器实现类、迭代器实现类抽象出来的接口或协议。

迭代器模式示例代码如下(Swift语言):

protocol IteratorBluePrint{
    
    var collection:[AnyObject]{get set};
    var index:Int{get set};

    func first()->AnyObject;
    func last()->AnyObject;
    func next();
    func current()->AnyObject;
    func isEmpty()->Bool;
}

class Iterator:IteratorBluePrint{
    
    var collection:[AnyObject];
    var index:Int = 0;
    
    init(collection:[AnyObject]){
        self.collection = collection;
    }
    
    func first()->AnyObject{
        self.index = 0;
        return self.collection.first!;
    }
    
    func last()->AnyObject{
        self.index = self.collection.count - 1;
        return self.collection.last!;
    }
    
    func next(){
        if(self.index < (self.collection.count - 1)){
            self.index++;
        }else{
            print("End of Collection");
        }
    }
    
    func current()->AnyObject{
        return self.collection[self.index];
    }
    
    func isEmpty()->Bool{
        return self.collection.isEmpty;
    }
}

protocol CollectionBluePrint{
    
    var object:[AnyObject]{get set};
    func insert(object:AnyObject,index:Int);
    func append(object:AnyObject);
    func remove(index:Int);
    func iterator()->IteratorBluePrint;
}

class Collection:CollectionBluePrint{
    
    var object:[AnyObject];
    
    init(object:[AnyObject]){
        self.object = object;
    }
    func insert(object:AnyObject,index:Int){
        self.object.insert(object, atIndex: index)
    }
    
    func append(object:AnyObject){
        self.object.append(object);
    }
    
    func remove(index:Int){
        self.object.removeAtIndex(index);
    }
    
    func iterator()->IteratorBluePrint{
        return Iterator(collection: self.object);
    }
}

var collection:CollectionBluePrint = Collection(object: [1,"two","三"]);
var iterator = collection.iterator();
print(iterator.isEmpty());
print(iterator.first());
print(iterator.current());
iterator.next();
print(iterator.current());
iterator.next();
print(iterator.current());
iterator.next();
print(iterator.current());
print(iterator.last());

  代码分析:这里代码写的时候有部分取了巧,利用了一些基础库中自带的组合类型函数,也省略了一些迭代器接口没写出来(并不难),但是设计模式本身的结构是正确的。可以看到Iterator实现类遵循了IteratorBluePrint协议,主要职责是提供对一些集合的访问。而Collection实现类则是遵循了CollectionBluePrint协议,主要职责是保管集合,可以发现,两个实现类中都有一个AnyObject类型的数组,这便是两个实现类主要操作的对象,最后可以从输出中看出方法与被迭代的集合的关系。以下是上面代码的输出结果:

false
1
1
two
三
End of Collection
三
三

  总结:迭代器模式其实就是创建一个保管集合的类和一个访问集合的类,然后通过不暴露内部的方法访问集合內的数据,另外访问的算法还可以自定义,使得集合的访问更加灵活。


lZackx © 2022. All rights reserved.

Powered by Hydejack v9.1.6