รูปแบบ 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);

    }

}