设计模式之迭代器模式,golang,php实现

程序员卷不动了 2023-03-18 PM 470℃ 0条

迭代器模式是一种设计模式,其主要用途是定义外部访问一个集合(或者容器)中的元素的方式,同时又不暴露集合中元素的内部表示。

它的核心是将数据容器和访问容器元素的方法分离开来,这样不仅可以提高程序的可扩展性,还可以方便地更新容器的内部实现,而不会对迭代器的实现造成影响。

迭代器模式的实现需要以下几个元素:

  1. 迭代器类(Iterator Class):定义了访问容器中元素的方法,包括获取下一个元素、判断容器中是否还有元素等方法。
  2. 容器类(Container Class):定义了获取迭代器的方法,可以通过这个方法得到一个迭代器对象。一般来说,容器类还需要定义一个用于获取集合大小的方法。
  3. 具体迭代器类(Concrete Iterator Class):实现了迭代器类中定义的方法,用于访问容器中的元素。
  4. 具体容器类(Concrete Container Class):实现了容器类中定义的方法,用于获取具体迭代器对象。

迭代器模式的优点:

  1. 能够方便地访问容器中的元素,而不需要知道容器内部的实现。
  2. 通过分离容器和迭代器,不仅可以提高程序的可扩展性,还可以方便地更新容器的内部实现,而不会对迭代器的实现造成影响。
  3. 支持对容器元素的多种遍历方式。

迭代器模式的缺点:

  1. 对于简单的容器和访问方式,迭代器模式的开销可能比较大,需要多个类进行交互,导致复杂度较高。
  2. 对于容器中元素的修改,需要在迭代器中考虑到线程安全性等问题。

golang实现

// 迭代器接口
type Iterator interface {
     HasNext() bool      // 是否还有下一个元素
     Next() interface{}  // 获取下一个元素
}

// 数组是一个容器
type Array struct {
     data []interface{}  // 存储数据的数组
}

// 实现迭代器接口
func (arr *Array) Iterator() Iterator {
     return &ArrayIterator{arr, 0}
}

// 构造函数,创建一个新的数组
func NewArray(len int) *Array {
     return &Array{make([]interface{}, len)}
}

// 获取数组长度
func (arr *Array) GetLength() int {
     return len(arr.data)
}

// 获取数组中的元素
func (arr *Array) Get(index int) interface{} {
     return arr.data[index]
}

// 设置数组中的元素
func (arr *Array) Set(index int, val interface{}) {
     arr.data[index] = val
}

// 数组迭代器
type ArrayIterator struct {
     array *Array   // 迭代的数组
     index int      // 当前位置索引
}

// 实现 Iterator 接口方法
func (iter *ArrayIterator) HasNext() bool {
     return iter.index < iter.array.GetLength()
}

func (iter *ArrayIterator) Next() interface{} {
     val := iter.array.Get(iter.index)
     iter.index++
     return val
}

func main() {
     arr := NewArray(3)    // 创建一个数组
     arr.Set(0, "hello")
     arr.Set(1, "world")
     arr.Set(2, 123)
     // 获取迭代器并遍历数组中的元素
     iter := arr.Iterator()
     for iter.HasNext() {
         val := iter.Next()
         fmt.Println(val)
     }
}

php实现

// 迭代器接口
interface Iterator {
    public function hasNext();  // 是否还有下一个元素
    public function next();  // 获取下一个元素
}

// 数组是一个容器
class ArrayCollection {
    private $data; // 存储数据的数组

    public function __construct($arr) {
        $this->data = $arr;
    }

    // 获取数组长度
    public function getLength() {
        return count($this->data);
    }

    // 获取数组中的元素
    public function get($index) {
        return $this->data[$index];
    }

    // 设置数组中的元素
    public function set($index, $val) {
        $this->data[$index] = $val;
    }

    // 获取数组迭代器
    public function getIterator() {
        return new ArrayIterator($this);
    }
}

// 数组迭代器
class ArrayIterator implements Iterator {
    private $array;  // 迭代的数组
    private $index;  // 当前位置索引

    public function __construct($arr) {
        $this->array = $arr;
        $this->index = 0;
    }

    // 实现 Iterator 接口方法
    public function hasNext() {
        return $this->index < $this->array->getLength();
    }

    public function next() {
        $val = $this->array->get($this->index);
        $this->index++;
        return $val;
    }
}

// 创建一个新的数组容器
$arr = new ArrayCollection(array("hello", "world", 123));

// 遍历数组中的元素
$iterator = $arr->getIterator();
while ($iterator->hasNext()) {
    $val = $iterator->next();
    echo $val . "\n";
}

我们定义了一个数组容器类 ArrayCollection,实现了接口 Iterator 中的两个方法,即 hasNext() 和 next() 方法,并且提供了创建和访问数组的方法。在主函数中,我们首先创建了一个数组对象,然后通过迭代器遍历了数组中的所有元素。

需要注意的是,PHP 中的迭代器跟 Java、Python 等语言中的略有不同。在 PHP 中,一个迭代器只需要实现两个方法:hasNext() 方法用于判断是否还有下一个元素,next() 方法用于返回下一个元素。

标签: 设计模式

非特殊说明,本博所有文章均为博主原创。

评论啦~