Java23種設計模式之-----迭代模式

一、什麼是迭代模式?
Iteration模式也叫迭代模式,是行爲模式之一,它把對容器中包含的內部對象的訪問委讓給外部類,使用Iteration(遍歷)按順序進行遍歷訪問的設計模式。
二、不使用迭代模式的應用
在應用Iterator模式之前,首先應該明白Iteratior模式用來解決什麼問題。或者說,如果不使用Iterator模式,會存在什麼樣的問題。
1、由容器自己實現順序遍歷。直接在容器類裏直接添加順序遍歷方法
2、讓調用者自己實現遍歷。直接暴露數據細節給外部
三、代碼實現
1、由容器自己實現順序遍歷。直接在容器類裏直接添加順序遍歷方法
1.1、創建Book類

package com.renxin.iterator;

public class Book {

    private int id;
    private String name;
    private double price;

    public Book(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void display() {
        System.out.println("編號:"+id+",書名:"+name+",價格:"+price);
    }


}

1.2、創建BookList類:

package com.renxin.iterator;

import java.util.ArrayList;
import java.util.List;

public class BookList {

    private List<Book> bookList;
    private int index;

    public BookList() {
        bookList = new ArrayList<Book>();
    }

    //添加書籍
    public void addBook(Book book) {
        bookList.add(book);
    }
    //刪除書籍
    public void deleteBook(Book book) { 
        int bookIndex = bookList.indexOf(book);
        bookList.remove(bookIndex);
    }

    //判斷是否有一本書
    public boolean hasNext() {
        if(index >= bookList.size()) {
            return false;
        }
        return true;
    }
    //獲得下一本書
    public Book getNext() {
        return bookList.get(index++);
    }
}

1.3、創建測試類MainClass

package com.renxin.iterator;

public class MainClass {

    public static void main(String[] args) {
        BookList bookList = new BookList();

        Book book1 = new Book(1,"《Java編程思想》",80);
        Book book2 = new Book(2,"《Java從精通到放棄》",60);

        bookList.addBook(book1);
        bookList.addBook(book2);

        while(bookList.hasNext()) {
            Book book = bookList.getNext();
            book.display();
        }

    }

}

控制檯打印結果爲:

編號:1,書名:《Java編程思想》,價格:80.0
編號:2,書名:《Java從精通到放棄》,價格:60.0

2、讓調用者自己實現遍歷。直接暴露數據細節給外部
2.1、修改BookList

package com.renxin.iterator;

import java.util.ArrayList;
import java.util.List;

public class BookList {

    private List<Book> bookList;
    private int index;

    public BookList() {
        bookList = new ArrayList<Book>();
    }

    //添加書籍
    public void addBook(Book book) {
        bookList.add(book);
    }
    //刪除書籍
    public void deleteBook(Book book) { 
        int bookIndex = bookList.indexOf(book);
        bookList.remove(bookIndex);
    }
    //方法一:
    /*//判斷是否有一本書
    public boolean hasNext() {
        if(index >= bookList.size()) {
            return false;
        }
        return true;
    }
    //獲得下一本書
    public Book getNext() {
        return bookList.get(index++);
    }*/

    //方法二
    public List<Book> getBookList(){
        return bookList;
    }
}

2.2、修改測試類MainClass

package com.renxin.iterator;

import java.util.List;

public class MainClass {

    public static void main(String[] args) {
        BookList bookList = new BookList();

        Book book1 = new Book(1,"《Java編程思想》",80);
        Book book2 = new Book(2,"《Java從精通到放棄》",60);

        bookList.addBook(book1);
        bookList.addBook(book2);

        /*while(bookList.hasNext()) {
            Book book = bookList.getNext();
            book.display();
        }*/

        List<Book> bookDateList = bookList.getBookList();
        for(int i = 0;i< bookDateList.size();i++) {
            Book book = bookDateList.get(i);
            book.display();
        }

    }

}

控制檯輸出結果爲:

編號:1,書名:《Java編程思想》,價格:80.0
編號:2,書名:《Java從精通到放棄》,價格:60.0

四、不使用迭代模式的缺點
以上方法1與方法2都可以實現對遍歷,這樣又問題呢?
1、容器類承擔了太多功能:一方面需要提供添加刪除等本身應有的功能;一方面還需要提供遍歷訪問的功能。
2、往往容器在實現遍歷的過程中,需要保存遍歷狀態,當跟元素的添加刪除等功能夾雜在一起,很容易引起混亂和程序運行錯誤等。
五、使用迭代模式的應用
Iterator模式就是爲了有效地處理順序進行遍歷訪問的一種設計模式,簡單地說,Iterator模式提供一種有效的方法,可以屏蔽聚焦對象集合的容器類的實現細節,而能對容器內包含的對象元素按順序進行有效的遍歷訪問。所以,Iterator模式的應用場景可以歸納爲滿足以下幾個條件:1、訪問容器中包含內部對象;2、按順序訪問
六、迭代模式的結構
這裏寫圖片描述
七、迭代模式的角色和職責
Iterator(迭代器接口):該接口必須定義實現迭代功能的最小定義方法集,比如提供hasNext()和next()方法。
Concreteiterator(迭代器實現類):迭代器接口Iterator的實現類。可以根據具體情況加以實現。
Aggregate(容器接口):定義基本功能以及提供類似Iterator iterator()方法。
ConcreteAggregate(容器實現類):容器接口的實現類,必須實現Iterator iterator()方法。
代碼實現:
(1)修改BookList

package com.renxin.iterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class BookList {

    private List<Book> bookList;
    private int index;
    private Iterator iterator;
    public BookList() {
        bookList = new ArrayList<Book>();
    }

    //添加書籍
    public void addBook(Book book) {
        bookList.add(book);
    }
    //刪除書籍
    public void deleteBook(Book book) { 
        int bookIndex = bookList.indexOf(book);
        bookList.remove(bookIndex);
    }
    //方法一:
    /*//判斷是否有一本書
    public boolean hasNext() {
        if(index >= bookList.size()) {
            return false;
        }
        return true;
    }
    //獲得下一本書
    public Book getNext() {
        return bookList.get(index++);
    }*/

    //方法二
    /*public List<Book> getBookList(){
        return bookList;
    }*/

    public Iterator Iterator() {
        return new Itr();
    }

    private class Itr implements Iterator{

        @Override
        public boolean hasNext() {
            if(index >= bookList.size()) {
                return false;
            }
            return true;
        }

        @Override
        public Object next() {
            return bookList.get(index++);
        }

    }
}

(2)、修改MainClass

package com.renxin.iterator;

import java.util.Iterator;

public class MainClass {

    public static void main(String[] args) {
        BookList bookList = new BookList();

        Book book1 = new Book(1,"《Java編程思想》",80);
        Book book2 = new Book(2,"《Java從精通到放棄》",60);

        bookList.addBook(book1);
        bookList.addBook(book2);

        /*while(bookList.hasNext()) {
            Book book = bookList.getNext();
            book.display();
        }*/

    /*  List<Book> bookDateList = bookList.getBookList();
        for(int i = 0;i< bookDateList.size();i++) {
            Book book = bookDateList.get(i);
            book.display();
        }*/

        Iterator iter = bookList.Iterator();
        while(iter.hasNext()) {
            Book book = (Book) iter.next();
            book.display();
        }

    }

}

控制檯輸出結果爲:

編號:1,書名:《Java編程思想》,價格:80.0
編號:2,書名:《Java從精通到放棄》,價格:60.0

八、迭代模式的優點
1、實現功能分離,簡化容器接口。讓容器只實現本身的基本功能,把迭代功能委讓給外部類實現,符合類的設計原則。
2、隱藏容器的實現細節。
3、爲容器或其子容器提供一個統一接口,一方面方便調用;另一方面使得調用者不必關注迭代器的實現細節。
4、可以爲容器或其子容器實現不同的迭代方法或多個迭代方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章