Nói một cách rất đơn giản (vì các câu trả lời khác đang giới thiệu bạn đến tất cả các mẫu thiết kế chính thức, vì vậy hãy xem chúng để biết thêm chi tiết):
Nếu bạn muốn có một lớp được theo dõi bởi các lớp khác trong hệ sinh thái của chương trình của bạn, bạn nói rằng bạn muốn lớp đó có thể quan sát được. Tức là có thể có một số thay đổi trong trạng thái mà bạn muốn phát cho phần còn lại của chương trình.
Bây giờ, để làm điều này, chúng ta phải gọi một số phương thức. Chúng tôi không muốn lớp Có thể quan sát được kết hợp chặt chẽ với các lớp quan tâm đến việc quan sát nó. Nó không quan tâm nó là ai miễn là nó đáp ứng các tiêu chí nhất định. (Hãy tưởng tượng đó là một đài phát thanh, không quan tâm ai đang nghe miễn là họ có đài FM được điều chỉnh theo tần số của họ). Để đạt được điều đó, chúng tôi sử dụng một giao diện, được gọi là Người quan sát.
Do đó, lớp Observable sẽ có một danh sách các Observers (tức là các thể hiện triển khai các phương thức giao diện Observer mà bạn có thể có). Bất cứ khi nào nó muốn phát sóng một cái gì đó, nó chỉ gọi phương thức trên tất cả các quan sát viên, từng người một.
Điều cuối cùng để đóng câu đố là làm thế nào để lớp quan sát biết ai quan tâm? Vì vậy, lớp Observable phải cung cấp một số cơ chế để cho phép Người quan sát đăng ký sở thích của họ. Một phương thức như addObserver(Observer o)
bên trong thêm Trình quan sát vào danh sách người quan sát, để khi có điều gì đó quan trọng xảy ra, nó sẽ lặp qua danh sách và gọi phương thức thông báo tương ứng của giao diện Người quan sát của từng phiên bản trong danh sách.
Có thể là trong cuộc phỏng vấn họ không hỏi bạn rõ ràng về java.util.Observer
và java.util.Observable
nhưng về khái niệm chung chung. Khái niệm này là một mẫu thiết kế, mà Java tình cờ cung cấp hỗ trợ trực tiếp ra khỏi hộp để giúp bạn thực hiện nhanh chóng khi bạn cần. Vì vậy, tôi sẽ đề nghị bạn hiểu khái niệm hơn là các phương thức / lớp thực tế (mà bạn có thể tra cứu khi bạn cần chúng).
CẬP NHẬT
Đáp lại bình luận của bạn, java.util.Observable
lớp học thực tế cung cấp các phương tiện sau:
Duy trì một danh sách các java.util.Observer
trường hợp. Các trường hợp mới quan tâm đến việc được thông báo có thể được thêm thông qua addObserver(Observer o)
và xóa qua deleteObserver(Observer o)
.
Duy trì trạng thái bên trong, chỉ định liệu đối tượng có thay đổi kể từ thông báo cuối cùng cho người quan sát hay không. Điều này rất hữu ích vì nó tách biệt phần mà bạn nói rằng phần Observable
đã thay đổi, từ phần bạn thông báo thay đổi. (Ví dụ: Nó hữu ích nếu bạn có nhiều thay đổi xảy ra và bạn chỉ muốn thông báo ở cuối quá trình chứ không phải ở mỗi bước nhỏ). Điều này được thực hiện thông qua setChanged()
. Vì vậy, bạn chỉ cần gọi nó khi bạn thay đổi một cái gì đó thành Observable
và bạn muốn phần còn lại Observers
cuối cùng biết về nó.
Thông báo cho tất cả các nhà quan sát rằng cụ thể Observable
đã thay đổi trạng thái. Điều này được thực hiện thông qua notifyObservers()
. Điều này kiểm tra xem đối tượng đã thực sự thay đổi (tức là một cuộc gọi setChanged()
được thực hiện) trước khi tiến hành thông báo. Có 2 phiên bản, một phiên bản không có đối số và một phiên bản có đối Object
số, trong trường hợp bạn muốn truyền một số thông tin bổ sung với thông báo. Trong nội bộ những gì xảy ra là nó chỉ lặp qua danh sách các Observer
thể hiện và gọi update(Observable o, Object arg)
phương thức cho mỗi trường hợp đó. Điều này cho biết Observer
đối tượng quan sát được đã thay đổi (bạn có thể quan sát nhiều hơn một) và phần bổ sung Object arg
để có khả năng mang thêm một số thông tin (được truyền qua notifyObservers()
.