Mẫu thiết kế - Mẫu người quan sát

Mẫu quan sát đượ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 của nó sẽ được thông báo tự động. Mẫu người quan sát thuộc danh mục mẫu hành vi.

Thực hiện

Mẫu quan sát sử dụng ba lớp tác nhân. Chủ thể, Người quan sát và Khách hàng. Đối tượng là một đối tượng có các phương pháp để gắn và tách người quan sát vào một đối tượng khách hàng. Chúng ta đã tạo một Observer lớp trừu tượng và một Subject của lớp cụ thể đang mở rộng lớp Observer .

ObserverPatternDemo , lớp demo của chúng tôi, sẽ sử dụng Chủ đề và đối tượng lớp cụ thể để hiển thị mẫu người quan sát đang hoạt động.

Bước 1

Tạo lớp Chủ đề.

Subject.java

import java.util.ArrayList;
import java.util.List;

public class Subject {
	
   private List<Observer> observers = new ArrayList<Observer>();
   private int state;

   public int getState() {
      return state;
   }

   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }

   public void attach(Observer observer){
      observers.add(observer);		
   }

   public void notifyAllObservers(){
      for (Observer observer : observers) {
         observer.update();
      }
   } 	
}

Bước 2

Tạo lớp Observer.

Observer.java

public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}

Bước 3

Tạo các lớp quan sát cụ thể

BinaryObserver.java

public class BinaryObserver extends Observer{

   public BinaryObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); 
   }
}

OctalObserver.java

public class OctalObserver extends Observer{

   public OctalObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
     System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); 
   }
}

HexaObserver.java

public class HexaObserver extends Observer{

   public HexaObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); 
   }
}

Bước 4

Sử dụng Chủ thể và các đối tượng quan sát cụ thể.

ObserverPatternDemo.java

public class ObserverPatternDemo {
   public static void main(String[] args) {
      Subject subject = new Subject();

      new HexaObserver(subject);
      new OctalObserver(subject);
      new BinaryObserver(subject);

      System.out.println("First state change: 15");	
      subject.setState(15);
      System.out.println("Second state change: 10");	
      subject.setState(10);
   }
}

Bước 5

Xác minh kết quả đầu ra.

First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010