รูปแบบ observer เป็นการสร้างความสัมพันธ์แบบ one to many ระหว่าง
ออบเจกต์ โดยออบเจกต์หลัก (subject) จะถือรายการของออบเจกต์ที่เฝ้าสังเกตุ (observer) ออบเจกต์หลักจะมีเมธอดในการเพิ่มหรือถอดออบเจกต์เฝ้าสังเกตุออกจากรายการที่ถือไว้ และเมื่อออบเจกต์หลักมีการเปลี่ยนแปลงสถานะจะแจ้งเตือนทุกๆออบเจกต์เฝ้าสังเกตุที่อยู่ในรายการให้ทราบถึงการเปลี่ยนแปลง โดยการเรียกเมธอดของแต่ละออบเจกต์เฝ้าสังเกตุ จากนั้นออบเจกต์เฝ้าสังเกตุจะสอบถามมายังออบเจกต์หลักถึงรายละเอียดการเปลี่ยนแปลงเพื่อนำไปปรับปรุงสถานะของตนเอง การใช้รูปแบบ observer ช่วยลดความผูกพันระหว่างออบเจกต์หลักและออบเจกต์เฝ้าสังเกตุ เพราะออบเจกต์หลักไม่จำเป็นต้องรู้ว่าออบเจกต์เฝ้าสังเกตุทำงานอย่างไร ทำให้การเพิ่มออบเจกต์เฝ้าสังเกตุทำได้ง่ายโดยไม่ต้องแก้ไขออบเจกต์หลัก รูปแบบ observer มักจะถูกใช้ในการออกแบบส่วนติดต่อผู้ใช้งาน และยังถูกใช้ในระบบที่ทำงานตามเหตุการณ์ (event-driven)
ส่วนประกอบของรูปแบบ observer ประกอบด้วย (1) ภาพสรุปออบเจกต์หลัก (subject abstraction) : เป็นคลาสแบบอินเตอร์เฟสหรือคลาสแบบแอบเสตรกของออบเจกต์หลักจะเป็นออบเจกต์ที่ถือรายการของออบเจกต์เฝ้าสังเกตุที่เกี่ยวข้องและคอยแจ้งออบเจกต์เฝ้าสังเกตุเมื่อมีการเปลี่ยนแปลงสถานะที่ออบเจกต์หลัก (2) ภาพสรุปออบเจกต์เฝ้าสังเกตุ (observer abstraction) : เป็นคลาสแบบอินเตอร์เฟสหรือคลาสแบบแอบเสตรกที่กำหนดเมธอดสำหรับให้ออบเจกต์หลักเรียกใช้เมื่อต้องการแจ้งออบเจกต์เฝ้าสังเกตุ (3) ออบเจกต์หลัก (concrete subject) : เป็นคลาสที่สืบทอหรือใช้อินเตอร์เฟสของออบเจกต์หลัก (4) ออบเจกต์เฝ้าสังเกตุ (concrete observer) เป็นคลาสที่สืบทอหรือใช้อินเตอร์เฟสของออบเจกต์เฝ้าสังเกตุ
ตัวอย่างในภาษาจาวา
import java.util.ArrayList;
interface Observer {
void update(int value);
}
interface Subject {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
class ConcreteSubject implements Subject {
private int value;
private ArrayList<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(value);
}
}
public void setValue(int value) {
this.value = value;
notifyObservers();
}
}
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
public void update(int value) {
System.out.println(name + ” has been notified of the value: ” + value);
}
}
public class Main {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver(“Observer 1”);
ConcreteObserver observer2 = new ConcreteObserver(“Observer 2”);
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.setValue(10);
subject.removeObserver(observer1);
subject.setValue(20);
}
}