Skip to content

Commit b0e6434

Browse files
committed
new
1 parent 732f047 commit b0e6434

File tree

3 files changed

+228
-2
lines changed

3 files changed

+228
-2
lines changed

2. Classes in Java/AdapterClass.java

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
// Xem xét ví dụ sau:
2+
/*
3+
* - Chúng ta muốn kết nối một ứng dụng với một hệ thống nhạc.
4+
* - Ứng dụng của chúng ta có một interface để điều kiển nhạc.
5+
* - Nhưng hệ thống nhạc sử dụng các API không tương thích với interface của chúng ta.
6+
*/
7+
8+
// Interface để điều khiển nhạc.
9+
interface MusicPlayerControl {
10+
void play(); // Phát nhạc.
11+
12+
void stop(); // Dừng phát nhạc.
13+
14+
void pause(); // Tạm dừng phát nhạc.
15+
}
16+
17+
// Hệ thống nhạc sử dụng các API không tương thích với interface của chúng ta.
18+
class AdvancedMusicPlayer {
19+
public void startPlayback() {
20+
System.out.println("Playback started.");
21+
}
22+
23+
public void stopPlayback() {
24+
System.out.println("Playback stopped.");
25+
}
26+
27+
public void pausePlayback() {
28+
System.out.println("Playback paused.");
29+
}
30+
}
31+
32+
// #################################################################
33+
// ################ Cách 1: Sử dụng Inner Class ####################
34+
// #################################################################
35+
36+
// Sử dụng nội lớp để kết nối ứng dụng với hệ thống nhạc.
37+
class MusicSystem {
38+
private AdvancedMusicPlayer player = new AdvancedMusicPlayer();
39+
40+
private class MusicPlayerAdapter implements MusicPlayerControl {
41+
public void play() {
42+
player.startPlayback();
43+
}
44+
45+
public void stop() {
46+
player.stopPlayback();
47+
}
48+
49+
public void pause() {
50+
player.pausePlayback();
51+
}
52+
}
53+
54+
public MusicPlayerControl getController() {
55+
return new MusicPlayerAdapter();
56+
}
57+
}
58+
59+
// ################################################################
60+
// ################ Cách 2: Sử dụng Adapter Class #################
61+
// ################################################################
62+
class MusicPlayerAdapter implements MusicPlayerControl {
63+
private AdvancedMusicPlayer player;
64+
65+
public MusicPlayerAdapter(AdvancedMusicPlayer player) {
66+
this.player = player;
67+
}
68+
69+
public void play() {
70+
player.startPlayback();
71+
}
72+
73+
public void stop() {
74+
player.stopPlayback();
75+
}
76+
77+
public void pause() {
78+
player.pausePlayback();
79+
}
80+
}
81+
82+
// Nếu không sử dụng inner class, chúng ta phải tạo một lớp adapter riêng biệt.
83+
// Điều này có thể làm tăng độ phức tạp của cấu trúc dự án và làm cho các thành
84+
// phần phụ thuộc lẫn nhau một cách không cần thiết.
85+
86+
// ##################### Lớp thực thi #########################
87+
88+
public class AdapterClass {
89+
public static void main(String[] args) {
90+
// Sử dụng Inner Class
91+
MusicSystem system = new MusicSystem();
92+
MusicPlayerControl controller = system.getController();
93+
94+
controller.play();
95+
controller.pause();
96+
controller.stop();
97+
98+
// Sử dụng Adapter Class
99+
AdvancedMusicPlayer player = new AdvancedMusicPlayer();
100+
MusicPlayerControl newController = new MusicPlayerAdapter(player);
101+
102+
newController.play();
103+
newController.pause();
104+
newController.stop();
105+
}
106+
}

2. Classes in Java/InnerClass.java

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,125 @@
11
// Tiếp tục về lớp chồng nhau (nested class, inner class).
2+
3+
// 1. Inner Classes as Adapters
24
/*
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ộ.
410
*/
511

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+
666
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"));
772

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+
}
881
}
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

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ Java là một trong những ngôn ngữ lập trình phổ biến nhất đư
7272

7373
## Mục lục
7474

75-
Trong khi sử dụng kho lưu trữ này cho việc học tập, bạn nên tuân theo nguyên tắc sắp xếp được đề cập sau đây. Hãy đọc các mục theo đúng quy tắc từ trên xuống dưới, những phần đầu tiên sẽ là cơ sở của những nội dung tiếp theo. Riêng phần *Phụ lục* bạn có thể tham khảo bất cứ lúc nào, nó chứa một số cuốn sách tôi sử dụng cho việc thiết kế nên kho lưu trữ này.<br/>
75+
Trong khi sử dụng kho lưu trữ này cho việc học tập, bạn nên tuân theo nguyên tắc sắp xếp được đề cập sau đây. Hãy đọc các mục theo đúng quy tắc từ trên xuống dưới, những phần đầu tiên sẽ là cơ sở của những nội dung tiếp theo. Riêng phần *Phụ lục* bạn có thể tham khảo bất cứ lúc nào, nó chứa một số cuốn sách tôi sử dụng cho việc thiết kế nên kho lưu trữ này.
76+
77+
> Để đồng bộ và dễ kiểm soát, lớp chứa phương thức main để thực thi mã được đặt tên giống như nội dung bài học. Các lớp khác trong bài học để minh họa. Chẳng hạn, bài học về Interface nằm trong `Interface.java` có các lớp: `Movable`, `Trackable`, `Drone`, `Interface` thì các lớp `Movable`, `Trackable`, `Drone` có tác dụng diễn giải cho kiến thức bài học, còn lớp `Interface` để thực thi mã từ các lớp trước nó.
7678
7779
<details>
7880
<summary>Phần 1: Giới thiệu</summary>
@@ -115,6 +117,7 @@ Trong khi sử dụng kho lưu trữ này cho việc học tập, bạn nên tu
115117
- [SubInterface](2.%20Classes%20in%20Java/SubInterface.java)
116118
- [NestedClass](2.%20Classes%20in%20Java/NestedClass.java)
117119
- [InnerClass](2.%20Classes%20in%20Java/InnerClass.java)
120+
- [AdapterClass](2.%20Classes%20in%20Java/AdapterClass.java)
118121

119122
</details>
120123

0 commit comments

Comments
 (0)