Mode pengamat adalah salah satu mode desain perangkat lunak dan juga umum digunakan, terutama dalam pemrograman GUI. Ada banyak artikel tentang pola desain yang ditulis di internet, dan banyak artikel ditulis dengan baik. Meskipun ada kecurigaan mengulangi roda awal, roda ini bukan roda lain, dengan fokus yang berbeda, ide yang berbeda, dan berbagai cara untuk mengatakannya.
Elemen kunci
tema:
Suatu topik adalah objek yang diamati oleh pengamat. Suatu topik harus memiliki tiga karakteristik berikut.
Pengamat:
Ketika subjek berubah, menerima pemberitahuan untuk pemrosesan spesifik adalah fitur yang harus dimiliki pengamat.
Mengapa menggunakan mode ini
Berikut adalah contoh untuk menggambarkan bahwa stasiun pengiriman susu adalah temanya. Pelanggan berlangganan susu adalah monitor. Setelah pelanggan berlangganan susu dari stasiun pengiriman susu, ia akan menerima susu setiap hari. Jika pelanggan tidak ingin berlangganan, dia dapat membatalkan dan dia tidak akan menerima susu di masa depan.
Kopling longgar
Pengamat menambahkan atau menghapus kode tanpa memodifikasi topik, cukup panggil metode yang sesuai untuk menambahkan atau menghapus topik.
Subjek hanya bertanggung jawab untuk memberi tahu pengamat, tetapi tidak perlu tahu bagaimana pengamat berurusan dengan pemberitahuan. Misalnya, stasiun pengiriman susu hanya bertanggung jawab untuk mengirimkan susu dan tidak peduli apakah pelanggan meminumnya atau mencuci muka.
Pengamat hanya perlu menunggu pemberitahuan topik, tanpa mengamati detail yang terkait dengan topik tersebut. Adapun contoh yang sama, pelanggan hanya perlu peduli dengan stasiun pengiriman susu untuk mengirimkan susu, bukan tentang kurir mana dari atau jenis transportasi apa untuk mengirimkan susu.
Java mengimplementasikan mode pengamat
1. Implementasi Java sendiri
Diagram kelas
/ ** * Target pengamatan mewarisi dari java.util.observable * @author stone * */ class public updateObservable memperluas {private int data; Public UpdateObServable (Observer Observer) {AddoBserver (Observer); / * * Tambahkan pengamat lain */} int getData publik () {return data; } public void setData (int data) {if (data! = this.data) {this.data = data; setChanged (); // tag perubahan, notifyoBserver (); // notifikasi}} @Override public disinkronkan void addobserver (pengamat o) {super.addobserver (o); } @Override public disinkronkan void deleteoBserver (pengamat o) {super.deleteObserver (o); } @Override public void notifyoBserver () {super.notifyoBserver (); } @Override public void notifyoBserver (objek arg) {super.notifyoBserver (arg); } @Override public disinkronkan void deleteoBserver () {super.deleteoBserver (); } @Override dilindungi void void setChanged () {super.setchanged (); } @Override dilindungi void clearchanged () {super.clearchanged (); } @Override Public Sinkronisasi Boolean HasChanged () {return super.haschanged (); } @Override Public Sinkronisasi int countoBserver () {return super.countoBserver (); }} / ** * Pengamat mengimplementasikan antarmuka java.util.observer * @Author Stone * */ Update Class Publik mengimplementasikan pengamat {@Override Public Void Update (Observable O, Object Arg) {System.out.println ("Pemberitahuan Data Perubahan Data:"); if (o instanceof updateObservable) {updateObservable uo = (updateObservable) o; System.out.print ("Data diubah menjadi:" + uo.getData ()); }}} 2. Model Pengamatan Kustom
Diagram kelas
/ ** * Abstrak Pengamat * Pembaruan Observasi * @Author Stone * */ Antarmuka Publik IWatcher {/ * * Antarmuka Pemberitahuan: * 1. Pemberitahuan Sederhana * 2. Pengamat membutuhkan data perubahan target, sehingga target dapat digunakan sebagai parameter, lihat Java's Observer dan Observable * // Void Update (iwatched Watched); void update (); } / ** * Subjek target abstrak * menyediakan antarmuka untuk mendaftar dan menghapus objek pengamat, dan antarmuka untuk memberi tahu pengamat untuk mengamati * dan antarmuka yang targetnya diamati * @author stone * */ antarmuka publik iWatchedSubject {public void add (iWatcher watch); public void hapus (IWatcher Watch); public void notifywhatchers (); Public Void Update (); // Antarmuka ke perubahan bisnis yang diamati} / ** * Pengamat Pengamat Beton Khusus * * @Author Stone * */ Public Class UpdateWatcher mengimplementasikan iWatcher {@Override public void update () {System.out.println (ini + "diamati: target telah diperbarui"); }} / ** * Subjek beton peran target spesifik * @author stone * */ kelas publik updateWatchedSubject mengimplementasikan iWatchedSubject {daftar private <iWatcher>; Public UpdateWatchedSubject () {this.list = ArrayList baru <iWatcher> (); } @Override public void add (iWatcher watch) {this.list.add (watch); } @Override public void Remove (IWatcher Watch) {this.list.remove (watch); } @Override public void notifyWhatchers () {for (iWatcher Watcher: list) {watcher.update (); }} @Override public void update () {System.out.println ("Target Update ......"); NotifyWhatchers (); }} Seorang pendengar adalah implementasi pengamat:
Diagram kelas
/ ** * pendengar setelah mendaftar * @author stone * */ antarmuka publik iregisterlistener {void onRegistered (); } / ** * pendengar ketika pengguna masuk * @author stone * */ antarmuka publik IloginListener {void onLogined (); } /** Pendengar adalah implementasi dari mode pengamat* Tambahkan pendengar ke beberapa antarmuka bisnis yang memerlukan mendengarkan, hubungi metode yang sesuai dari pendengar untuk mengimplementasikan pendengaran*/ pengguna kelas publik {public void register (IREGISTERListener register) {/** do ... Register*/ System.out.println ("Registering ..."); // setelah registrasi register.onon registered (); } Login public void (login iloginListener) { / * * do ... login * / system.out.println ("mendaftar ..."); // setelah login.onloGined (); }} /*** Pola Perilaku Mode Pengamat* Mode pengamat mendefinisikan ketergantungan satu-ke-banyak, memungkinkan beberapa objek pengamat untuk mengamati objek target pada saat yang sama. * Ketika objek target ini berubah dalam keadaannya, ia akan memberi tahu semua objek pengamat, sehingga mereka dapat secara otomatis memperbarui diri mereka sendiri. Objek target membutuhkan antarmuka untuk menambah, menghapus, dan memberi tahu pengamat * * @author stone */ tes kelas publik {public static void main (string [] args) {/ * * Gunakan antarmuka pengamat Java sendiri dan kelas yang dapat diamati */ updateObservable Observable = new UpdateObServable (new UpdateObServer ()); Observable.setData (99); System.out.println (""); System.out.println (""); /** Model Pengamat Kustom*/ iWatchedSubject Watched = new UpdateWatchedSubject (); watched.add (updateWatcher baru ()); watched.add (updateWatcher baru ()); watched.update (); System.out.println (""); /** Sub-Mode-Listener*/ pengguna pengguna = pengguna baru (); user.register (new iregisterListener () {@Override public void onRegistered () {System.out.println ("Setelah mendengarkan pendaftaran ...");}}); user.login (new iloginListener () {@Override public void onlogined () {System.out.println ("Setelah mendengarkan login ...");}}); }}Mencetak
Pemberitahuan Perubahan Data yang Diterima: Data diubah menjadi: 99 target sedang diperbarui ... pengamat.updatewatcher@457471E0 Diamati: target telah diperbarui pengamat.updatewatcher@5fe04cbf diamati: target telah diperbarui dan mendaftar ... setelah mendengarkan pendaftaran. . . Masuk ... setelah mendengarkan login. . .