Observer pattern merupakan salah satu Software Design Pattern yang berguna untuk memantain state (keadaan) dari sesuatu dan mengabarkan state tersebut kepada bagian-bagian yang membutuhkan. Saya akan menjelaskan gambaran lebih detail tentang design pattern ini dan contoh implementasinya dalam Java. Tapi, sebelum itu, saya akan coba memberikan gambaran konseptual mengenai observer pattern.
Menjelang lebaran, Budi ingin mencari baju kemeja warna biru merk “harvest” di toko baju terdekat. Ketika ia datang, ke toko tersebut, ternyata yang ada baju warna merah. Selang 1 minggu, ia pun kembali lagi datang ke toko tersebut, tetapi stok baju biru belum tersedia. Beberapa hari berikutnya, ia mengecek lagi, tetapi stok baju biru yang ia inginkan juga belum tersedia. Akhirnya, Budi memutuskan untuk menghubungi CS toko tersebut dan memberikan nomor hanphonenya. Ia memesan kepada CS tersebut untuk menghubungi Budi apabila stok baju biru yang diinginkannya sudah tersedia.
Skenario Budi ketika menghubungi CS untuk diberi informasi stok baju biru tersebut merupakan contoh gambaran mengenai apa itu Observer Pattern.
Bagaimana Observer Pattern ini bekerja?
Misalkan ada 3 customer, customer1, customer2, customer3. Mereka semua menginginkan baju biru dengan model/spesifikasi yang sama. Mereka menghubungi CS, untuk dan meminta agar CS melakukan ‘Notify’ kepada mereka apabila stok baju biru tersedia. Kemungkinan juga karena suatu hal, salah satu customer, misalnya, customer3, tidak jadi memesan, sehingga tidak jadi di ‘Notify’ ketika stok baru tersedia.
Design pattern ini bisa juga dikatakan sebagai publisher-subscriber, di mana customer bisa kita ibaratkan sebagai subsriber, dan CS kita ibaratkan sebagai publisher.
Dalam design pattern ini, ada 2 entitas yang saling berhubungan, yaitu Observer dan Subject. Hubungan antara kedua entitas ini adalah One To Many atau Many to One. Satu subjek dapat disubcribe oleh beberapa observer.
- Semua customer yang menginginkan baju biru kita katakan sebagai: Observers
- Sedangkan, objek yang diinginkan user, yakni baju biru tersebut kita katakan sebagai Subject. Dalam terminologi lain, Subject ini disebut juga Observable.
Ringkasnya, ada pemesan, ada yang dipesan. Pemesan adalah Observer, dan yang dipesan adalah Observable/Subject.
Berikut in adalah behaviour yang wajib dilakukan oleh Subject/Observable:
- Register Observer: Observable dapat mendaftarkan observer yang akan melakukan subscribe
- Notify Observer: Beri tahu observer ketika ada perubahan state
- Remove Observer: Unsubscibe dari observable (objek yang disubcribe)
Adapun behaviour yang dimiliki oleh Observer adalah:
- Update: sesuatu yang dilakukan ketika mendapat notifikasi dari Observer
Berikut ini bentuk class diagram dari obversver pattern.
Pertama, kita bahas behaviour Observable. Behaviour Observable dapat kita definisikan dalam sebuah interface
public interface Observable { void addObserver(Observer o); void removeObserver(Observer o); void notifyObserver(); }
Mari kita implementasi skenario Budi mencari kemeja biru di atas dalam program Java
public class BlueDress implements Observable { private boolean inStock = true; private ArrayList<Observer> customers; public BlueDress(Boolean inStock) { this.inStock = inStock; customers = new ArrayList<Observer>(); } public boolean isInStock(){ return inStock; } public void setInStock(boolean inStock){ this.inStock = inStock; if(isInStock()){ notifyObserver(); } } @Override public void addObserver(Observer o) { customers.add(o); } @Override public void removeObserver(Observer o) { customers.remove(o); } @Override public void notifyObserver() { for(int i=0; i< customers.size(); i++){ customers.get(i).update(); } } }
Kelas BlueDress adalah representasi dari baju yang dicari Budi. Ia memiliki atribut inStock, artinya stok tersedia. Karena BlueDress merupakan objek yang disubscribe, berarti ia adalah Observable. Oleh karenanya, perlu mengimplementasi interface Observable.
Kemudian, untuk Observer, ia memiliki behaviour ‘update’. Artinya melakukan sesuatu ketika di-notify oleh Observable.
public interface Observer { public void update(); }
Observer dalam hal kasus ini adalah Budi (Customer). Maka dari itu kita bisa buat representasinya dalam sebuah class yang mengimplementasi interface Observer.
public class Customer implements Observer { private Observable observable; private String username; public Customer(Observable observable, String username){ this.observable = observable; this.username = username; } @Override public void update() { System.out.println("New blue dress available."); buyDress(); } private void buyDress(){ System.out.println(username +" getting new blue dress."); } public void unsubscribe(){ observable.removeObserver(this); } }
Kelas Customer adalah representasi dari customer yang mencari baju biru. Ia memiliki nama, dan dapat melakukan unsubscribe kapan saja. Dalam contoh di atas, ketika BlueDress tersedia, maka method update akan dipanggil. Ketika itu, kita dapat menentukan apa yang dilakukan oleh Observer, misalnya melakukan pembelian baju tersebut. Pada kelas tersebut, cunstructor dibuat memiliki parameter objek Observable supaya dapat melakukan unsubscribe melalui objek customer/observer.
Testing
Untuk mengetahui bagaimana observer pattern ini bekerja, kita bisa melakukan testing dengan membuat beberapa objek customer(Observer) dan mendaftarkannya untuk sebuah BlueDress (Observable).
BlueDress blueDress = new BlueDress(true); Customer customer1 = new Customer(blueDress, "Andy"); blueDress.addObserver(customer1); Customer customer2 = new Customer(blueDress, "Henry"); blueDress.addObserver(customer2);
Implementasi di atas menjelaskan, ada dua customer yang mencari baju biru, Andi dan Henry. Ketika stok baju biru tersedia, ia ingin segera dikabari agar dapat langsung membeli.
Ketika baju biru tersedia,
blueDress.setInStock(true);
Maka, otomatis semua customer akan diberi tahu. Berikut output dari perintah di atas:
07-28 17:04:36.149 17082-17082/ixsanslabs.com.observerpattern D/OpenGLRenderer﹕ Enabling debug mode 0 07-28 17:04:40.329 17082-17082/ixsanslabs.com.observerpattern I/System.out﹕ New blue dress available. 07-28 17:04:40.329 17082-17082/ixsanslabs.com.observerpattern I/System.out﹕ Andy getting new blue dress. 07-28 17:04:40.329 17082-17082/ixsanslabs.com.observerpattern I/System.out﹕ New blue dress available. 07-28 17:04:40.329 17082-17082/ixsanslabs.com.observerpattern I/System.out﹕ Henry getting new blue dress.