Mô tả chung
Observer thuộc nhóm Behavioral. Mẫu
này được sử dụng khi có mối quan hệ một-nhiều giữa các đối tượng, chẳng
hạn như nếu một đối tượng được sửa đổi, các đối tượng phụ thuộc vào nó sẽ được
thông báo tự động
Observer gồm một đối tượng gọi là
subject, đối tượng này duy trì một danh sách các thành phần phụ thuộc nó gọi là
observer, và thông báo tới chúng một cách tự động về bất cứ thay đổi nào, thường
thì bằng cách gọi một phương thức của chúng.
Khi nào nên dùng?
- Sự thay đổi trạng thái ở một đối tượng
và cần thông báo đến các đối tượng khác mà không phải giữ chúng liên kết quá chặt
chẽ với nhau.
- Cần mở rộng dự án với ít sự thay đổi
nhất.
Thành phần Cấu trúc
Subject
- Ở đây Subject được hiểu như "ông
chủ", là một interface với các phương thức
- attach điều thêm một nhân
viên đến làm việc (attach observer object),
- detach rút một nhân viên
đi nơi khác (detach observer object)
- notify thông báo cho toàn
bộ nhân viên làm một việc gì đó (notify observer update)
ConcreteSubject
Nhiệm vụ là lưu trữ trạng thái của các
ConcreteObserver objects và từ các trạng thái này sẽ gửi đi thông báo mỗi khi
trạng thái bị thay đổi.
- setState optional - thiết đặt trạng
thái cho Subject
- getState optional - lấy trạng thái hiện
tại của Subject
Observer
Là một interface\abstract được định
nghĩa với phương thức update, phương thức này sẽ nhận thay đổi mỗi khi có thông
báo từ Subject.
ConcreteObserver
- Luôn duy trì một tham chiếu đến một ConcreteSubject
- Cần phải lưu trữ trạng thái phù hợp với
trạng thái của Subject
- Thực thi phương thức update của
Observer để trạng thái luôn đồng nhất với trạng thái của Subject (sử dụng mỗi
khi có notify)
Triển khai
Chúng ta cài đặt các class, interface
như sau:
Bước 1:
Tạo interface Observer
public interface Observer {
public abstract void update(String message);
}
Bước 2: Tạo
lớp Subject
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers =
new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyChange(String message) {
for(Observer observer : observers) {
observer.update();
}
}
}
Bước 3: Client
để chạy thử
public class Client {
public static void main(String[] args) {
Subject subject = new Subject();
Observer observer1 = new Observer() {
public void update(String message) {
System.out.println("Message
1 changed: " + message);
}
};
subject.attach(observer1);
Observer observer2 = new Observer() {
public void update(String message) {
System.out.println("Message
2 changed: " + message);
}
};
subject.attach(observer2);
subject.notifyChange("Test change
state 1");
subject.detach(observer1);
subject.notifyChange("Test change
state 2");
}
}
Và kết quả khi chạy chương trình:
Đăng nhận xét