中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中的迭代器模式的作用是什么

發布時間:2021-09-07 14:27:35 來源:億速云 閱讀:154 作者:chen 欄目:編程語言

本篇內容主要講解“python中的迭代器模式的作用是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“python中的迭代器模式的作用是什么”吧!

(一)什么是迭代器模式

迭代器模式應該是23種設計模式中,程序員最容易理解的設計模式了,因為迭代器模式在日常的開發過程中經常使用到。以最常見的循環為例:

for(int i=0;i<arr.length;i++){
    System.out.print(arr[i]);
}

上面的這段代碼通過循環逐一將arr的下標加1,從而實現了遍歷數組的功能。

 但是通過循環實現遍歷的話依賴于集合對象內部,因此就有了一種能順序訪問集合對象中各個元素,又無需依賴對象內部表示的設計模式--迭代器模式。

(二)迭代器模式中的角色

迭代器模式中的角色主要有4種:

1、迭代器接口(Iterator):定義訪問和遍歷集合元素的接口,一般包含next()和hasNext()方法。

2、具體迭代器(ConcreteIterator):該角色用于實現迭代器接口,迭代器的核心遍歷邏輯在這里實現。

3、集合接口(Aggregate):集合接口定義了創建迭代器的接口方法,內部定義了iterator方法。

4、具體集合(ConcreteAggregate):該角色用于實現集合接口,他會創建出具體的Iterator角色。

看到這里如果你覺得比較疑惑不要緊,下面會通過代碼的方式來加深理解。

(三)迭代器模式的代碼實現

首先說一下這段代碼的場景,定義了一個教室的類,又定義了學生的類,實現遍歷教室中學生的功能。

代碼列表如下:

interface Aggregate:集合接口
interface Iterator:迭代器接口
class Classroom:教室類,實現集合接口,屬于具體的集合
class ClassroomIterator:教室迭代器,實現迭代器接口,屬于具體的迭代器
class Student:學生類

首先把迭代器模式中的兩個接口角色定義出來:

public interface Aggregate {
    Iterator iterator();
}
 
public interface Iterator {
    boolean hasNext();
    Object next();
}

接著定義學生類:

@Data
@AllArgsConstructor
public class Student {
    private String name;
}

接著定義教室類,在教室類中我們定義了Student集合,以及當前的集合長度和最大長度。同時實現Aggregate接口的iterator方法,這個方法將會返回一個迭代器對象。這個迭代器對象由ClassroomIterator提供

public class Classroom implements Aggregate{
    private Student[] students;
    private int length=0;
    private int maxSize;
 
    public Classroom(int maxSize){
        this.maxSize=maxSize;
        students=new Student[maxSize];
    }
 
    public Student getStudent(int index){
        return students[index];
    }
 
    public boolean addStudent(Student student){
        if (length>=maxSize){
            return false;
        }
        this.students[length]=student;
        length++;
        return true;
    }
 
    public int getLength(){
        return this.length;
    }
 
    @Override
    public Iterator iterator() {
        return new ClassroomIterator(this);
    }
}

最后就是ClassroomIterator對象了,ClassroomIterator屬于迭代器的具體實現,這里需要實現hasNext方法和next方法

public class ClassroomIterator implements Iterator{
    private Classroom classroom;
    private int index;
 
    public ClassroomIterator(Classroom classroom){
        this.classroom=classroom;
        this.index=0;
    }
    @Override
    public boolean hasNext() {
        if (this.index<classroom.getLength()){
            return true;
        }
        return false;
    }
 
    @Override
    public Object next() {
        Student student = classroom.getStudent(index);
        index++;
        return student;
    }
}

最后就是使用了,通過迭代器對象,我們可以直接遍歷classroom對象:

public static void main(String[] args) {
    Classroom classroom=new Classroom(3);
    classroom.addStudent(new Student("張三"));
    classroom.addStudent(new Student("李四"));
    classroom.addStudent(new Student("王五"));
    Iterator iterator = classroom.iterator();
    while (iterator.hasNext()){
        Student next = (Student) iterator.next();
        System.out.println(next.getName());
    }
}

(四)迭代器模式的作用

看到這里很多人可能會有疑問,寫了一堆,用循環不是更方便嗎?迭代器模式最大的作用是將遍歷和具體的實現分開,以上面的測試方法為例,遍歷時我們始終只用到了iterator對象,而沒有用到classroom,這就意味著我們之后可以完全復用這段代碼實現遍歷。

另一方面,如果我們發現在classroom里使用數組存儲student,后續無法擴容,想改為List集合,這個時候我們只需要修改ClassroomIterator和Classroom這兩個具體實現角色即可。而不用對使用中的代碼做任何修改,就比如上面這段測試遍歷代碼不需要任何變動。如果用的是for循環或者while循環,就意味著所有用到循環的地方都需要修改代碼。

(五)迭代器模式在源碼中的應用

迭代器模式的應用我們在敲代碼時肯定都用過,迭代器模式最佳實踐就是JDK中Iterator接口的設計

public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

到此,相信大家對“python中的迭代器模式的作用是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扬中市| 谢通门县| 嘉鱼县| 色达县| 新宾| 壶关县| 藁城市| 宜宾市| 成武县| 杭锦后旗| 若羌县| 洪泽县| 永宁县| 开平市| 平谷区| 全南县| 岐山县| 新绛县| 安远县| 驻马店市| 兴文县| 苗栗县| 屏东市| 富蕴县| 河西区| 嘉义县| 易门县| 巫溪县| 紫金县| 衡东县| 青浦区| 观塘区| 永胜县| 乌拉特中旗| 仲巴县| 天峨县| 扎兰屯市| 玛纳斯县| 武穴市| 嘉义县| 乌审旗|