欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

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

安國(guó)網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),安國(guó)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為安國(guó)數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的安國(guó)做網(wǎng)站的公司定做!

(一)什么是迭代器模式

迭代器模式應(yīng)該是23種設(shè)計(jì)模式中,程序員最容易理解的設(shè)計(jì)模式了,因?yàn)榈髂J皆谌粘5拈_發(fā)過程中經(jīng)常使用到。以最常見的循環(huán)為例:

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

上面的這段代碼通過循環(huán)逐一將arr的下標(biāo)加1,從而實(shí)現(xiàn)了遍歷數(shù)組的功能。

 但是通過循環(huán)實(shí)現(xiàn)遍歷的話依賴于集合對(duì)象內(nèi)部,因此就有了一種能順序訪問集合對(duì)象中各個(gè)元素,又無需依賴對(duì)象內(nèi)部表示的設(shè)計(jì)模式--迭代器模式。

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

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

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

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

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

4、具體集合(ConcreteAggregate):該角色用于實(shí)現(xiàn)集合接口,他會(huì)創(chuàng)建出具體的Iterator角色。

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

(三)迭代器模式的代碼實(shí)現(xiàn)

首先說一下這段代碼的場(chǎng)景,定義了一個(gè)教室的類,又定義了學(xué)生的類,實(shí)現(xiàn)遍歷教室中學(xué)生的功能。

代碼列表如下:

interface Aggregate:集合接口
interface Iterator:迭代器接口
class Classroom:教室類,實(shí)現(xiàn)集合接口,屬于具體的集合
class ClassroomIterator:教室迭代器,實(shí)現(xiàn)迭代器接口,屬于具體的迭代器
class Student:學(xué)生類

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

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

接著定義學(xué)生類:

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

接著定義教室類,在教室類中我們定義了Student集合,以及當(dāng)前的集合長(zhǎng)度和最大長(zhǎng)度。同時(shí)實(shí)現(xiàn)Aggregate接口的iterator方法,這個(gè)方法將會(huì)返回一個(gè)迭代器對(duì)象。這個(gè)迭代器對(duì)象由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對(duì)象了,ClassroomIterator屬于迭代器的具體實(shí)現(xiàn),這里需要實(shí)現(xiàn)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;
    }
}

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

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());
    }
}

(四)迭代器模式的作用

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

另一方面,如果我們發(fā)現(xiàn)在classroom里使用數(shù)組存儲(chǔ)student,后續(xù)無法擴(kuò)容,想改為L(zhǎng)ist集合,這個(gè)時(shí)候我們只需要修改ClassroomIterator和Classroom這兩個(gè)具體實(shí)現(xiàn)角色即可。而不用對(duì)使用中的代碼做任何修改,就比如上面這段測(cè)試遍歷代碼不需要任何變動(dòng)。如果用的是for循環(huán)或者while循環(huán),就意味著所有用到循環(huán)的地方都需要修改代碼。

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

迭代器模式的應(yīng)用我們?cè)谇么a時(shí)肯定都用過,迭代器模式最佳實(shí)踐就是JDK中Iterator接口的設(shè)計(jì)

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());
    }
}

到此,相信大家對(duì)“python中的迭代器模式的作用是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

當(dāng)前文章:python中的迭代器模式的作用是什么
分享網(wǎng)址:http://www.chinadenli.net/article19/jsgcgh.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名企業(yè)建站響應(yīng)式網(wǎng)站定制網(wǎng)站App開發(fā)網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司