|
1 | 1 | // Tiếp tục về lớp chồng nhau (nested class, inner class).
|
| 2 | + |
| 3 | +// 1. Inner Classes as Adapters |
2 | 4 | /*
|
3 |
| - * |
| 5 | + * Một trong những ứng dụng phổ biến của inner class là sử dụng chúng như một adapter class (lớp tiếp hợp). |
| 6 | + * - Lớp tiếp hợp (adapter class) là một lớp giúp kết nối giữa hai lớp không liên quan với nhau. |
| 7 | + * - Việc sử dụng inner classes như là các adapter cho phép tách biệt rõ ràng giữa các chức năng |
| 8 | + * và giữ gìn tính đóng gói, đồng thời cung cấp một cách linh hoạt để mở rộng chức năng của một |
| 9 | + * lớp mà không làm phức tạp hoặc làm lộ dữ liệu nội bộ. |
4 | 10 | */
|
5 | 11 |
|
| 12 | +// Ví dụ: |
| 13 | + |
| 14 | +import java.util.ArrayList; |
| 15 | +import java.util.Iterator; |
| 16 | +import java.util.List; |
| 17 | + |
| 18 | +// Lớp Book chứa thông tin về một cuốn sách (tên sách, tác giả) |
| 19 | +class Book { |
| 20 | + String title; |
| 21 | + String author; |
| 22 | + |
| 23 | + Book(String title, String author) { |
| 24 | + this.title = title; |
| 25 | + this.author = author; |
| 26 | + } |
| 27 | + |
| 28 | + @Override |
| 29 | + public String toString() { |
| 30 | + return title + " by " + author; |
| 31 | + } |
| 32 | +} |
| 33 | + |
| 34 | +// Lớp BookList chứa một danh sách các cuốn sách. |
| 35 | +class BookList { |
| 36 | + private List<Book> books = new ArrayList<>(); |
| 37 | + |
| 38 | + public void addBook(Book book) { |
| 39 | + books.add(book); |
| 40 | + } |
| 41 | + |
| 42 | + public int getSize() { |
| 43 | + return books.size(); |
| 44 | + } |
| 45 | + |
| 46 | + // Nội lớp cung cấp iterator để duyệt qua danh sách các cuốn sách. |
| 47 | + public class BookIterator implements Iterator<Book> { |
| 48 | + private int index = 0; |
| 49 | + |
| 50 | + @Override |
| 51 | + public boolean hasNext() { |
| 52 | + return index < books.size(); |
| 53 | + } |
| 54 | + |
| 55 | + @Override |
| 56 | + public Book next() { |
| 57 | + return books.get(index++); |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + public BookIterator getIterator() { |
| 62 | + return new BookIterator(); |
| 63 | + } |
| 64 | +} |
| 65 | + |
6 | 66 | public class InnerClass {
|
| 67 | + public static void main(String[] args) { |
| 68 | + BookList myList = new BookList(); |
| 69 | + |
| 70 | + myList.addBook(new Book("The Java Programming", "James Gosling")); |
| 71 | + myList.addBook(new Book("Learn Python Programming", "Guido van Rossum")); |
7 | 72 |
|
| 73 | + // Lấy ra một iterator để duyệt qua danh sách các cuốn sách. |
| 74 | + BookList.BookIterator iterator = myList.getIterator(); |
| 75 | + |
| 76 | + // Duyệt qua danh sách các cuốn sách và in ra màn hình. |
| 77 | + while (iterator.hasNext()) { |
| 78 | + System.out.println(iterator.next()); |
| 79 | + } |
| 80 | + } |
8 | 81 | }
|
| 82 | + |
| 83 | +// Mục đích của ví dụ: |
| 84 | +/* |
| 85 | + * Trong trường hợp này, BookList là một lớp quản lý một danh sách các sách. |
| 86 | + * Chúng ta muốn có thể duyệt qua các sách trong danh sách này một cách tuần tự, |
| 87 | + * nhưng BookList không tự nó cung cấp phương thức để làm điều đó. Để giải quyết |
| 88 | + * vấn đề này, chúng ta sử dụng một inner class (BookListIterator) để cung cấp |
| 89 | + * khả năng iterator mà không cần phải thay đổi cấu trúc hoặc công khai chi tiết |
| 90 | + * nội bộ của BookList. |
| 91 | + */ |
| 92 | + |
| 93 | +// Chú thích: Interator là một interface trong Java Collection Framework, nó |
| 94 | +// cung cấp |
| 95 | +// các phương thức để duyệt qua các phần tử của một Collection. |
| 96 | +// - boolean hasNext(): Kiểm tra xem có phần tử tiếp theo không. |
| 97 | +// - next(): Trả về phần tử tiếp theo trong Collection. |
| 98 | +// - void remove(): Xóa phần tử hiện tại khỏi Collection. |
| 99 | + |
| 100 | +/* |
| 101 | + * Cách Hoạt Động Của BookList và BookListIterator |
| 102 | + * i) Lớp BookList: |
| 103 | + * - Đây là lớp chính chứa danh sách các sách. |
| 104 | + * - Lớp này cung cấp phương thức addBook() để thêm sách vào danh sách và phương |
| 105 | + * thức getIterator() để lấy một iterator. |
| 106 | + * ii) Inner Class BookListIterator: |
| 107 | + * - Đây là một inner class được định nghĩa bên trong BookList. Nó cung cấp các |
| 108 | + * phương thức để duyệt qua danh sách sách. |
| 109 | + * - hasNext(): Kiểm tra xem có sách tiếp theo trong danh sách không. |
| 110 | + * - next(): Trả về sách tiếp theo và di chuyển chỉ mục tiếp theo. Nếu không còn |
| 111 | + * sách, phương thức này sẽ ném ra một NoSuchElementException. |
| 112 | + */ |
| 113 | + |
| 114 | +/* |
| 115 | + * Tại Sao BookListIterator Là Một Adapter? |
| 116 | + * |
| 117 | + * BookListIterator đóng vai trò như một adapter vì nó "chuyển đổi" lớp BookList |
| 118 | + * từ một lớp không có khả năng iterator sang một lớp có thể được duyệt qua một |
| 119 | + * cách tuần tự. Nó làm điều này mà không yêu cầu BookList phải thực hiện trực |
| 120 | + * tiếp giao diện Iterable hoặc thay đổi thiết kế của nó để hỗ trợ duyệt. Thay |
| 121 | + * vào đó, BookListIterator cung cấp một cách để truy cập tuần tự đến các phần |
| 122 | + * tử của BookList từ bên trong lớp. |
| 123 | + */ |
| 124 | + |
| 125 | +// -> Xem thêm ví dụ ở file AdapterClass.java |
0 commit comments