Pola pengamat adalah pola desain perilaku. Penggunaan pola Observer adalah ketika Anda tertarik dengan keadaan suatu objek dan ingin diberi tahu setiap kali ada perubahan. Pada pola pengamat, objek yang mengamati keadaan objek lain disebut Pengamat, dan objek yang diamati disebut Subjek. Menurut aturan GoF, maksud dari pola Observer adalah:
Copy kode kodenya sebagai berikut:
Tentukan hubungan ketergantungan satu-ke-banyak antar objek. Jika status suatu objek berubah, objek terkait lainnya akan diberitahukan dan diperbarui secara otomatis.
Subjek berisi pengamat yang perlu diberi tahu ketika statusnya berubah. Oleh karena itu, pemerintah harus menyediakan metode bagi para pengamat untuk mendaftarkan diri dan membatalkan pendaftaran. Ketika Subjek (yang diamati) berubah, ia juga perlu menyertakan metode untuk memberi tahu semua pengamat. Saat memberi tahu pengamat, Anda dapat mendorong pembaruan atau memberikan metode lain untuk mendapatkan pembaruan.
Pengamat harus memiliki metode yang menetapkan objek pengamat dan dapat digunakan oleh pengamat untuk memberitahukan pembaruannya.
JAVA menyediakan cara bawaan untuk mengimplementasikan pola pengamat, antarmuka java.util.Observable dan java.util.Observer. Namun, penggunaannya tidak terlalu luas. Karena implementasi ini terlalu sederhana, sering kali kita tidak ingin kelas terakhir yang diperluas hanya menerapkan pola pengamat, karena kelas JAVA tidak dapat mewarisi berkali-kali.
Layanan pesan Java Messages Service (JMS) menggunakan mode pengamat dan mode perintah untuk merealisasikan publikasi dan langganan data antar program yang berbeda.
Kerangka kontrol tampilan model MVC juga menggunakan pola pengamat, memperlakukan model sebagai yang diamati dan tampilan sebagai pengamat. Tampilan dapat mendaftarkan dirinya ke model untuk menerima perubahan pada model.
Contoh pola pengamat
Dalam contoh ini, kita akan menyelesaikan diskusi topik sederhana, dan pengamat dapat mendaftar untuk topik ini. Setiap perubahan akibat pengiriman konten mengenai topik ini akan diberitahukan kepada semua pengamat terdaftar.
Berdasarkan kebutuhan pengamat Subjek, ini untuk mengimplementasikan antarmuka Subjek dasar. Antarmuka ini menentukan serangkaian metode spesifik yang perlu diimplementasikan di kelas tertentu yang selanjutnya mengimplementasikan antarmuka tersebut.
Copy kode kodenya sebagai berikut:
paket com.journaldev.design.observer;
antarmuka publik Subjek {
//metode untuk mendaftarkan dan membatalkan pendaftaran pengamat
register kekosongan publik (Obj Pengamat);
public void unregister(Obj Pengamat);
//metode untuk memberi tahu pengamat tentang perubahan
kekosongan publik notifyObservers();
//metode untuk mendapatkan pembaruan dari subjek
getUpdate Objek publik(Obj Pengamat);
}
Sekarang buat pengamat terkait. Dibutuhkan metode untuk melampirkan Subjek ke pengamat. Metode tambahan dapat menerima pemberitahuan perubahan subjek.
Copy kode kodenya sebagai berikut:
paket com.journaldev.design.observer;
antarmuka publik Pengamat {
//metode untuk memperbarui pengamat, digunakan oleh subjek
pembaruan kekosongan publik();
//lampirkan dengan subjek yang akan diamati
public void setSubject(Subjek);
}
Koneksi ini telah terjalin. Sekarang terapkan tema konkritnya.
Copy kode kodenya sebagai berikut:
paket com.journaldev.design.observer;
impor java.util.ArrayList;
impor java.util.List;
kelas publik MyTopic mengimplementasikan Subjek {
pengamat Daftar<Observer> pribadi;
pesan String pribadi;
boolean pribadi berubah;
Objek akhir pribadi MUTEX= Objek baru();
Topik Saya publik(){
this.observers=Daftar Array baru<>();
}
@Mengesampingkan
register kekosongan publik(Obj pengamat) {
if(obj == null) throw new NullPointerException("Null Observer");
if(!observers.contains(obj)) pengamat.add(obj);
}
@Mengesampingkan
public void unregister(Obj pengamat) {
pengamat.remove(obj);
}
@Mengesampingkan
kekosongan publik notifyObservers() {
Daftar<Pengamat> pengamatLokal = null;
//sinkronisasi digunakan untuk memastikan pengamat yang terdaftar setelah pesan diterima tidak diberitahu
disinkronkan (MUTEX) {
jika (!berubah)
kembali;
pengamatLokal = Daftar Array baru<>(ini.pengamat);
this.berubah=false;
}
untuk (Obj pengamat : pengamatLokal) {
obj.update();
}
}
@Mengesampingkan
Obyek publik getUpdate(Obj Pengamat) {
kembalikan ini.pesan;
}
//metode untuk mengirim pesan ke topik
public void postMessage(String pesan){
System.out.println("Pesan Dikirim ke Topik:"+pesan);
this.message=pesan;
this.berubah=benar;
beri tahuObserver();
}
}
Implementasi metode observasi pendaftaran dan pembatalan pendaftaran sangat sederhana. Metode tambahan postMessage() akan digunakan oleh klien untuk mengirimkan pesan string ke topik ini. Perhatikan bahwa variabel Boolean digunakan untuk melacak perubahan status topik dan memberi tahu pengamat tentang perubahan tersebut. Variabel ini diperlukan karena jika tidak ada update, namun seseorang memanggil metode notifyObservers(), ia tidak dapat mengirimkan informasi notifikasi kesalahan kepada pengamat.
Selain itu, perlu diperhatikan bahwa sinkronisasi digunakan di notifyObservers() untuk memastikan bahwa notifikasi hanya dapat dikirim ke pengamat terdaftar sebelum pesan dipublikasikan ke topik.
Berikut implementasi dari pengamat. Mereka akan selalu fokus pada objek subjeknya.
Copy kode kodenya sebagai berikut:
paket com.journaldev.design.observer;
kelas publik MyTopicSubscriber mengimplementasikan Observer {
nama String pribadi;
topik Subjek pribadi;
Pelanggan Topik Saya publik(String nm){
ini.nama=nm;
}
@Mengesampingkan
pembaruan kekosongan publik() {
Pesan string = (String) topik.getUpdate(ini);
jika(pesan==batal){
System.out.println(nama+":: Tidak ada pesan baru");
}kalau tidak
System.out.println(name+":: Menggunakan pesan::"+msg);
}
@Mengesampingkan
public void setSubject(Subjek Subjek) {
this.topik=sub;
}
}
Perhatikan bahwa penerapan metode update() menggunakan getUpdate() pengamat untuk menangani pesan yang diperbarui. Melewati pesan sebagai parameter ke metode update() harus dihindari di sini.
Berikut adalah program pengujian sederhana untuk memverifikasi implementasi kelas topik.
Copy kode kodenya sebagai berikut:
paket com.journaldev.design.observer;
kelas publik ObserverPatternTest {
public static void main(String[] args) {
//buat subjek
Topik MyTopic = MyTopic baru();
//buat pengamat
Pengamat obj1 = new MyTopicSubscriber("Obj1");
Obj2 pengamat = new MyTopicSubscriber("Obj2");
Pengamat obj3 = new MyTopicSubscriber("Obj3");
//mendaftarkan pengamat ke subjek
topik.register(obj1);
topik.register(obj2);
topik.register(obj3);
//lampirkan pengamat ke subjek
obj1.setSubject(topik);
obj2.setSubject(topik);
obj3.setSubject(topik);
//periksa apakah ada pembaruan yang tersedia
obj1.update();
//sekarang kirim pesan ke subjek
topik.postMessage("Pesan Baru");
}
}
Berikut adalah output di atas:
Copy kode kodenya sebagai berikut:
Keberatan1:: Tidak ada pesan baru
Pesan Diposting ke Topik:Pesan Baru
Keberatan1::Menggunakan pesan::Pesan Baru
Obj2::Menggunakan pesan::Pesan Baru
Keberatan3::Memakan pesan::Pesan Baru</pre>
Diagram UML pola Pengamat
Pola pengamat disebut juga pola terbitkan-berlangganan. Beberapa aplikasi khusus di JAVA adalah sebagai berikut:
1.java.util.EventListener di Swing
2.javax.servlet.http.HttpSessionBindingListener
3.javax.servlet.http.HttpSessionAttributeListener
Semua di atas adalah mode pengamat. Semoga Anda sudah menyukainya. Bagikan perasaan Anda di kolom komentar atau silakan bagikan kepada orang lain.