Design pattern – Iterator Pattern

3 min read

Iterator Pattern là gì

Iterator hay còn gọi là Cursor là một mẫu thiết kế thuộc nhóm hành vi (Behavioral Pattern).

Iterator được thiết kế cho phép xử lý nhiều loại tập hợp khác nhau bằng cách truy cập những phần tử của tập hợp với cùng một phương pháp, cùng một cách thức định sẵn, mà không cần phải hiểu rõ về những chi tiết bên trong của những tập hợp này.

Chúng ta có thể thấy Interator Pattern được áp dụng trong java với Interface iterator trong gói java.util.Iterator. Interface này định nghĩa các phương thức sau:

  • Hàm next() : trả về phần tử kế tiếp trong tập hợp
  • Hàm hasNext() : trả về giá trị True nếu vẫn còn phần tử trong tập hợp và trả về false trong trường hợp ngược lại.

Kiến Trúc

Sợ bộ qua ta có thể thấy interator sử dụng 2 interface chính

  • Aggregate : là một interface định nghĩa định nghĩa các phương thức để tạo Iterator object.
public interface Aggregate {
    Iterator createIterator();
}
  • Iterator : là một interface hay abstract class, khai báo các hoạt động cần thiết để tra so sánh một tập hợp: tìm nạp phần tử tiếp theo, truy xuất vị trí hiện tại, bắt đầu lại lặp lại, v.v.
public interface Iterator {
    boolean hasNext();
    Object next();
}

Và các triển khai của chúng

  • ConcreteAggregate : cài đặt các phương thức của Aggregate, lưu trữ các phần tử và cũng là nơi gọi triển khai của Iterator 
  • Concrete Iterator : implement các phương thức của Iterator, giữ index khi duyệt qua các phần tử. Cho phép một số trình vòng lặp đi qua cùng một bộ sưu tập độc lập với nhau.
import java.util.ArrayList;
import java.util.List;

public class BookCollection implements Aggregate {
    private List<String> books;

    public BookCollection() {
        this.books = new ArrayList<>();
    }

    public void addBook(String book) {
        books.add(book);
    }

    public List<String> getBooks() {
        return books;
    }

    @Override
    public Iterator createIterator() {
        return new BookIterator(this);
    }
}
public class BookIterator implements Iterator {
    private BookCollection bookCollection;
    private int currentIndex = 0;

    public BookIterator(BookCollection bookCollection) {
        this.bookCollection = bookCollection;
    }

    @Override
    public boolean hasNext() {
        return currentIndex < bookCollection.getBooks().size();
    }

    @Override
    public Object next() {
        if (hasNext()) {
            return bookCollection.getBooks().get(currentIndex++);
        }
        return null;
    }
}
public class Main {
    public static void main(String[] args) {
        // Tạo một bộ sưu tập sách
        BookCollection collection = new BookCollection();
        collection.addBook("Design Patterns");
        collection.addBook("Clean Code");
        collection.addBook("Effective Java");

        // Tạo một iterator
        Iterator iterator = collection.createIterator();

        // Duyệt qua tất cả sách
        while (iterator.hasNext()) {
            String book = (String) iterator.next();
            System.out.println(book);
        }
    }
}

Lợi ích của Iterator Pattern là gì?

Một số lợi ích khi sử dụng Iterator Pattern:

  • Đảm bảo nguyên tắc Single responsibility principle (SRP) : chúng ta có thể tách phần cài đặt các phương thức của tập hợp và phần duyệt qua các phần tử (iterator) theo từng class riêng lẻ.
  • Đảm bảo nguyên tắc Open/Closed Principle (OCP) : chúng ta có thể implement các loại collection mới và iterator mới, sau đó chuyển chúng vào code hiện có mà không vi phạm bất cứ nguyên tắc gì.
  • Chúng ta có thể truy cập song song trên cùng một tập hợp vì mỗi đối tượng iterator có chứa trạng thái riêng của nó.

Một số điểm cần xem xét khi sử dụng Iterator:

  • Sử dụng iterator có thể kém hiệu quả hơn so với việc duyệt qua các phần tử của bộ sưu tập một cách trực tiếp.
  • Có thể không cần thiết nếu ứng dụng chỉ hoạt động với các collection đơn giản.

Nguồn tham khảo

https://viblo.asia/p/iterator-design-pattern-tro-thu-dac-luc-cua-developers-jvElaNwY5kw#_7-design-pattern-lien-quan-8
Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *