Java Academy · Pelajaran

Corak Observer: Pemberitahuan Acara

Laksanakan Observer untuk mengasingkan pengeluar acara daripada pengguna dalam sistem harga saham.

Pelajaran 1 daripada 414 langkah

Corak Observer: Pemberitahuan Acara ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Niat Observer

Observer (juga dipanggil Terbit-Langgan) mentakrifkan kebergantungan satu kepada banyak: apabila keadaan subjek berubah, semua pemerhati berdaftar dimaklumkan secara automatik.

Antara Muka Subject dan Observer

Subject menjejaki senarai pemerhati dan memaklumkan mereka. Pemerhati melaksanakan kaedah update untuk bertindak balas terhadap acara.

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 Konkret: Stock Ticker

Subject menyimpan keadaan dan memanggil notifyObservers setiap kali keadaan berubah. Subject menguruskan senarai pemerhati.

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);
    }
}

Pemerhati Konkret

Setiap pemerhati bertindak balas secara berbeza terhadap pemberitahuan yang sama. Tambahkan pemerhati pada masa jalan tanpa mengubah 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);
    }
}

Menyambungkan Pemerhati

Daftarkan pemerhati pada subject. Kesemuanya bertindak balas apabila subject berubah. Nyahdaftar pemerhati untuk menghentikan penerimaan kemas kini.

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

java.util.Observable — Tidak Digunakan Lagi

JDK pernah menyediakan java.util.Observable dan java.util.Observer, tetapi kedua-duanya tidak digunakan lagi sejak Java 9. Laksanakan mekanisme sendiri atau gunakan pustaka reaktif seperti RxJava atau Project Reactor.

PropertyChangeListener

Komponen Java menyediakan PropertyChangeSupport — mekanisme pemerhati terbina dalam untuk perubahan sifat komponen yang banyak digunakan dalam Swing dan 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);
    }
}

Pemerhati Fungsian dengan Consumer

Gunakan Consumer<T> sebagai pemerhati ringan dan bukannya antara muka khusus — sesuai untuk panggilan balik acara yang mudah.

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 berbanding Bas Acara

Bas acara (seperti Guava EventBus) mengasingkan subject dan pemerhati dengan lebih jauh — subject menghantar acara kepada bas tanpa mengetahui siapa yang mendengar. Pemerhati melanggan melalui anotasi kaedah.

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

Keselamatan Utas dalam Observer

Jika pemerhati boleh ditambah atau dibuang daripada beberapa utas, lindungi senarai dengan synchronized atau gunakan CopyOnWriteArrayList untuk beban kerja yang banyak pemberitahuan.

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

Mengelakkan Kebocoran Memori

Rujukan kuat dalam senarai pemerhati menghalang GC. Gunakan WeakReference<Observer> atau sentiasa nyahdaftar pemerhati apabila tidak lagi diperlukan.

Observer dalam Rangka Kerja Sebenar

ApplicationEventPublisher milik Spring, Android LiveData dan sifat JavaFX semuanya merupakan pelaksanaan corak Observer pada tahap abstraksi yang berbeza.

Semakan Ringkas

Apakah manfaat utama corak Observer?

Imbas Kembali

Observer mentakrifkan rangkaian pemberitahuan satu kepada banyak. Laksanakannya melalui antara muka atau pengguna fungsian. Gunakan CopyOnWriteArrayList untuk keselamatan utas dan sentiasa nyahdaftar pemerhati bagi mengelakkan kebocoran.

Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Corak Observer: Pemberitahuan Acara” percuma?

Ya — teks penuh “Corak Observer: Pemberitahuan Acara” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Corak Observer: Pemberitahuan Acara”?

Laksanakan Observer untuk mengasingkan pengeluar acara daripada pengguna dalam sistem harga saham. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Corak Observer: Pemberitahuan Acara” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Corak Observer: Pemberitahuan Acara
  2. Corak Strategy: Algoritma Boleh Tukar Ganti
  3. Corak Command: Merangkum Tindakan
  4. Template Method: Mentakrifkan Rangka Algoritma
← Kembali ke Java Academy