Corak Observer: Pemberitahuan Acara
Laksanakan Observer untuk mengasingkan pengeluar acara daripada pengguna dalam sistem harga saham.
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 notifiedjava.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)); // publishKeselamatan 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.
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
- Corak Observer: Pemberitahuan Acara
- Corak Strategy: Algoritma Boleh Tukar Ganti
- Corak Command: Merangkum Tindakan
- Template Method: Mentakrifkan Rangka Algoritma