Outline
Introduction to Observer General Example Motivation for Using Example of the Problem Aspects of Observer Design Generalized Structure Two Ways to Implement Updates
General Implementation
Benefits of the Observer Pattern Trouble Spots
Introduction to Observer
A Gang of Four (GoF) design pattern, salah satu pola yang dibahas dalam Desain Pattern : Elements of Reusable ObjectOriented Software by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Observer mendefinisikan kebergantungan antar objek dalam bentuk one-to-many atau many-to-many. Ketika kondisi suatu objek mengalami perubahan, maka semua objek lain yang bergantung pada objek tersebut akan diperbarui secara otomatis. Digunakan untuk penanganan event (event handling) di mana diperlukan konsistensi antara objek, misalnya Swing Framework untuk pengembangan GUI.
General Example
Misalkan Anda memiliki beberapa data yang dapat ditampilkan dalam tabel, grafik batang atau pie chart. Perubahan data yang mendasari harus tercermin/tergambar dalam semua tiga tampilan. Di sinilah Observer Desain Pattern sangat berguna.
Generalized Structure
ConcreteSubject
Mengimplementasikan antarmuka Subyek (Subject interface). Mengelola referensi (references) baik langsung atau tidak langsung dengan satu atau lebih ConcreteObservers. Terus melacak keadaannya (state) sendiri. Ketika terjadi perubahan keadaan (state), maka state tersebut akan mengirimkan pemberitahuan (notification) kepada semua Observers dengan memanggil (call) metode update() mereka.
ConcreteObserver
Ini adalah objek yang sebenarnya (actual object) yang mengamati keadaan (state) ConcreteSubject tersebut. State yang dikelola harus selalu konsisten dengan keadaan Subjectnya. Mengimplementasikan metode update().
General Implementation
Subjects dapat melacak Observers melalui ArrayLists atau struktur data lainnya. Observers dapat melacak beberapa Subjects dan mendapatkan data yang berbeda dari masing-masing. Pull model menggunakan metode pembaruan yang mengambil referensi ke Subjects sebagai parameter. Subjects harus memicu (men-trigger) metode update ketika state-nya berubah.
General Implementation
Metode yang mengubah keadaan (state) dengan memanggil (call) metode stateChanged() : public void notifyObservers(){ for(Observer o: observers)
o.update();
} public void stateChanged(){ // do other things / melakukan hal-hal yang lainnya notifyObservers(); // do whatever else still needs doing / melakukan apa saja yang masih perlu dilakukan. } public void setMeasurements(arguments.) { // set instance variables first / mengatur variabel tingkat pertama stateChanged(); }
class DevilListener implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println("Come on, do it!"); } }
} When we click the button, both listeners are notified and take action. Elisabeth Freeman, Eric Freeman, Sierra, and Bates, Head First Design Patterns,OReilly 2004, p. 73
Implementation in Java
Java telah built-in untuk mendukung konsep Observer. java.util.Observable class dapat di-extended oleh Subject. java.util.Observer interface dapat diimplementasikan oleh kelas yang ingin mengamati (observe) Subject.
Methods in java.util.Observable
Observable()
Membuat Observable object(Subject) tanpa melakukan inisialisasi Observers.
setChanged()
Mengindikasikan bahwa suatu Subject telah berubah dalam beberapa cara.
hasChanged()
Returns True jika metode setChanged() sudah dipanggil kembali (recently) daripada metode clearChanged(). Returns False jika sebaliknya.
clearChanged()
Menunjukkan bahwa objek ini telah melakukan pemberitahuan kepada semua observers terhadap perubahan-perubahan terbaru. Hal ini akan dilakukan call secara otomatis oleh metode notifyObservers().
countObservers()
Mengembalikan jumlah objek yang Observing Subject.
deleteObserver(Observer o) / deleteObservers()
Menghapus Observer object yang dilalui atau semua Observer object dari masing-masing daftar Observers yang disimpan oleh Subject.
Methods in java.util.Observer
update(Observable o, Object arg)
Dipanggil (called) ketika Subject telah berubah. o adalah Subject yang dimaksud/ bersangkutan, dan arg adalah argumen yang dapat dikirimkan untuk memberitahu Observer mana saja yang atribut Subject-nya telah berubah.
Tidak dapat menulis/membentuk kelas lain yang memiliki suatu Observable (kelas yang dapat diamati) karena setChanged() yang ada bersifat protected.
Trouble Spots
Harus memberikan banyak notifikasi jika Observers memperbarui klien/ pelanggan mereka sendiri atau jika mereka juga membuat perubahan terhadap Subject-nya. Mengulangi pemberitahuan bila terjadi perubahan secara berurutan/ beruntun. "Menggantung di referensi/ Dangling references untuk Subjects atau Observers ketika salah satu jenis/tipenya dihapus secara manual dalam non-garbage collected environments. Maka diharuskan perlu memberitahu Observers ketika Subjects tersebut dihapus, dan sebaliknya. keadaan subjek (Subject state) harus konsisten (self-consistent) sebelum memanggil (calling) notify(), terutama yang menggunakan Pull Model. Harus berhati-hati untuk tidak melakukan push irrelevant information pada observers dengan Push Model. Jika update() gagal, Observer tidak bisa mengetahui apakah informasi yang hilang tersebut penting ataukah tidak penting.
Tugas Kelompok
Jelaskan perbedaan class dan interface ! Jelaskan perbedaan antara abstract classs dan concrete class ! Jelaskan perbedaan antara extends dan implements pada class dan interface ! Buatlah minimal 1 contoh program sederhana dengan keyword overloading, overriding, extend, implement. (silahkan ambil dari text book/ internet, dengan syarat cantumkan sumbernya) !