0Pricing
Java Academy · บทเรียน

รูปแบบ Observer: การแจ้งเตือนเหตุการณ์

ใช้งาน Observer เพื่อแยกผู้สร้างเหตุการณ์ออกจากผู้รับเหตุการณ์ในระบบราคาหุ้น

รูปแบบ Observer: การแจ้งเตือนเหตุการณ์ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

เจตนาของ Observer

Observer หรือที่เรียกอีกอย่างว่าแบบเผยแพร่-สมัครรับข้อมูล กำหนดการพึ่งพาแบบหนึ่งต่อหลาย เมื่อสถานะของ Subject เปลี่ยนแปลง Observer ที่ลงทะเบียนไว้ทั้งหมดจะได้รับการแจ้งเตือนโดยอัตโนมัติ

อินเทอร์เฟซ Subject และ Observer

Subject จะติดตามรายการ Observer และแจ้งเตือน Observer เหล่านั้น ส่วน Observer จะใช้งานเมธอด update เพื่อตอบสนองต่อเหตุการณ์

public interface Observer {
    void update(String event, Object data);
}
public interface Subject {
    void addObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers(String event, Object data);
}

Subject รูปธรรม: Stock Ticker

Subject จะเก็บสถานะและเรียก notifyObservers ทุกครั้งที่สถานะเปลี่ยนแปลง นอกจากนี้ยังจัดการรายการ Observer ด้วย

public class StockTicker implements Subject {
    private final List<Observer> observers = new ArrayList<>();
    private double price;
    public void addObserver(Observer o)    { observers.add(o); }
    public void removeObserver(Observer o) { observers.remove(o); }
    public void setPrice(double p) {
        this.price = p;
        notifyObservers("PRICE_CHANGED", p);
    }
    public void notifyObservers(String ev, Object data) {
        for (Observer o : observers) o.update(ev, data);
    }
}

Observer รูปธรรม

Observer แต่ละตัวจะตอบสนองต่อการแจ้งเตือนเดียวกันแตกต่างกัน คุณสามารถเพิ่ม Observer ขณะทำงานได้โดยไม่ต้องแก้ไข Subject

public class AlertSystem implements Observer {
    public void update(String ev, Object data) {
        if ((double) data < 100) System.out.println("ALERT: Low price!");
    }
}
public class Logger implements Observer {
    public void update(String ev, Object data) {
        System.out.println("LOG: " + ev + " = " + data);
    }
}

การเชื่อมต่อ Observer

ลงทะเบียน Observer กับ Subject Observer ทั้งหมดจะตอบสนองเมื่อ Subject เปลี่ยนแปลง ยกเลิกการลงทะเบียนเพื่อหยุดรับการอัปเดต

StockTicker ticker = new StockTicker();
ticker.addObserver(new AlertSystem());
ticker.addObserver(new Logger());
ticker.setPrice(95.5); // both observers notified

java.util.Observable — เลิกใช้แล้ว

JDK เคยมี java.util.Observable และ java.util.Observer แต่ทั้งสองรายการเลิกใช้แล้วตั้งแต่ Java 9 ให้สร้างการใช้งานของคุณเอง หรือใช้ไลบรารีเชิงรีแอกทีฟ เช่น RxJava หรือ Project Reactor

PropertyChangeListener

Java beans มี PropertyChangeSupport ซึ่งเป็นกลไก Observer ในตัวสำหรับการเปลี่ยนแปลงคุณสมบัติของบีน และถูกใช้อย่างมากใน Swing และ JavaFX

public class Model {
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
    private int value;
    public void addPropertyChangeListener(PropertyChangeListener l) { pcs.addPropertyChangeListener(l); }
    public void setValue(int v) {
        int old = this.value; this.value = v;
        pcs.firePropertyChange("value", old, v);
    }
}

Observer เชิงฟังก์ชันด้วย Consumer

ใช้ Consumer<T> เป็น Observer แบบน้ำหนักเบาแทนอินเทอร์เฟซเฉพาะ เหมาะอย่างยิ่งสำหรับการเรียกกลับของเหตุการณ์แบบง่าย

List<Consumer<Double>> listeners = new ArrayList<>();
listeners.add(p -> { if (p < 100) System.out.println("Low price"); });
listeners.add(p -> System.out.println("Price: " + p));
double newPrice = 95.5;
listeners.forEach(l -> l.accept(newPrice));

Observer เทียบกับบัสเหตุการณ์

บัสเหตุการณ์ เช่น Guava EventBus ช่วยแยก Subject และ Observer ออกจากกันมากยิ่งขึ้น โดย Subject จะโพสต์เหตุการณ์ไปยังบัสโดยไม่รู้ว่าใครกำลังรับฟังอยู่ Observer จะสมัครรับข้อมูลผ่านคำอธิบายประกอบของเมธอด

// Guava EventBus example
EventBus bus = new EventBus();
bus.register(new Logger());       // subscribe
bus.post(new PriceEvent(95.5));   // publish

ความปลอดภัยต่อเธรดใน Observer

หากสามารถเพิ่มหรือนำ Observer ออกได้จากหลายเธรด ให้ป้องกันรายการด้วย synchronized หรือใช้ CopyOnWriteArrayList สำหรับงานที่มีการแจ้งเตือนจำนวนมาก

private final List<Observer> observers = new CopyOnWriteArrayList<>();

การหลีกเลี่ยงหน่วยความจำรั่ว

การอ้างอิงแบบเข้มแข็งในรายการ Observer จะป้องกันไม่ให้ GC ทำงาน ใช้ WeakReference<Observer> หรือยกเลิกการลงทะเบียน Observer ทุกครั้งเมื่อไม่จำเป็นต้องใช้งานอีกต่อไป

Observer ในเฟรมเวิร์กจริง

ApplicationEventPublisher ของ Spring, Android LiveData และคุณสมบัติของ JavaFX ล้วนเป็นการใช้งานรูปแบบ Observer ในระดับนามธรรมที่แตกต่างกัน

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ประโยชน์หลักของรูปแบบ Observer คืออะไร

สรุปทบทวน

Observer กำหนดสายการแจ้งเตือนแบบหนึ่งต่อหลาย ใช้งานได้ผ่านอินเทอร์เฟซหรือ Consumer เชิงฟังก์ชัน ใช้ CopyOnWriteArrayList เพื่อความปลอดภัยต่อเธรด และยกเลิกการลงทะเบียน Observer เสมอเพื่อป้องกันหน่วยความจำรั่ว

คำถามที่พบบ่อย

บทเรียน “รูปแบบ Observer: การแจ้งเตือนเหตุการณ์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบ Observer: การแจ้งเตือนเหตุการณ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบ Observer: การแจ้งเตือนเหตุการณ์”

ใช้งาน Observer เพื่อแยกผู้สร้างเหตุการณ์ออกจากผู้รับเหตุการณ์ในระบบราคาหุ้น คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบ Observer: การแจ้งเตือนเหตุการณ์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูปแบบ Observer: การแจ้งเตือนเหตุการณ์
  2. รูปแบบ Strategy: อัลกอริทึมที่สลับใช้ได้
  3. รูปแบบ Command: การห่อหุ้มการกระทำ
  4. Template Method: การกำหนดโครงร่างอัลกอริทึม
← กลับไปที่ Java Academy