Mẫu thiết kế Observer

Behavioral Design Pattern

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(message);

      }

  }

}

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:

Một ví dụ khác: https://yuen26.github.io/general/designpattern/2017-06-11-observer-pattern/


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Leave a Reply

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