Pattern Observer melibatkan dua object Subject dan Observer, dalam swing Observer dikenal sebagai Listener. Kemudian, ketika Subject akan memberitahu (notify) Observer tentang apa yang sedang terjadi dalam object Subject, ada satu informasi yang akan di-passing oleh Subject ke Observer, informasi ini disebut sebagai Event object. Sedangkan kejadian ketika Subject melakukan notify kepada Observer disebut sebagai Event triggering.
Agar penjelasan diatas mudah dipahami, kita akan membuat aplikasi sederhana yang mengimplementasikan pattern Observer. Aplikasi sederhana ini terdiri dari dua class utama yaitu Subject dan Observer.
Class Subject akan menjalankan sebuah loop tanpa batas, di dalam loop tersebut Subject akan meminta input dari user berupa sebuah kata yang diakhiri dengan penekanan enter. Ketika user menekan enter, Subject akan menotify Observer. Dalam proses notifikasi tersebut, Subject mengumpulkan informasi tentang event pemasukan kata oleh user, informasi tersebut berupa : kata apa yang dimaksukkan dan object subject dimana event pemasukan kata tersebut terjadi (source). Kemudian Observer akan menerima informasi dari Subject dan mencetak informasi tersebut ke standard output. Berikut ini tampilan dari aplikasi sederhana ini :
type a word : ifnu
print from observer : first observer
event from : subject observed
key presed is ifnu
Subject akan mencetak string “type a word :” dan menunggu user untuk memasukkan satu kata dan menekan enter. Misalnya dalam contoh diatas “ifnu”. Kemudian Subject akan menghimpun informasi tentang sumber event (Subject itu sendiri) dan kata yang diketikkan user (ifnu). Setelah itu, Subject memberitahu (notify) Observer bahwa telah terjadi event pemasukan kata dengan menyertakan informasi yang telah dihimpun Subject.
Observer menerima informasi dari Subject bahwa telah terjadi event pemasukan kata oleh user, selanjutnya Observer akan menjalankan tindakan-tindakan untuk menangani event tersebut. Tindakan tersebut adalah : mencetak informasi Observer, source, dan kata yang dimasukkan oleh user.
Di dalam class Subject terdapat field
1. Koleksi Observer (listeners)
2. Nama (name)
3. Kata yang dimasukkan user (wordEntered)
Kemudian ada juga method :
1. Constructor yang menerima parameter String, parameter ini digunakan sebagai pengenal (name) dari object Subject.
2. Register-unregister Observer (registerListener, removeListener)
3. Method private untuk menotify Observer (triggerListener)
4. Method untuk menerima input kata dari user (runProgram)
2. Register-unregister Observer (registerListener, removeListener)
3. Method private untuk menotify Observer (triggerListener)
4. Method untuk menerima input kata dari user (runProgram)
Berikut ini kode lengkapnya :
public class Subject {
private Set<KeyboardPressedListener> listeners =
new HashSet<KeyboardPressedListener>();
private String wordEntered;
private String name;
public Subject(String subjectName){
name = subjectName;
}
public void runProgram(){
while(true){
Console c = System.console();
wordEntered = c.readLine("type a word : ");
if(wordEntered.equals("exit"))
break;
else
triggerListener();
}
}
private void triggerListener(){
KeyboardPressedEvent event =
new KeyboardPressedEvent();
event.setSource(this);
event.setWord(wordEntered);
for(KeyboardPressedListener l : listeners){
l.keyPressed(event);
}
}
public void registerObserver(
KeyboardPressedListener l){ listeners.add(l); }
public void removeObserver(
KeyboardPressedListener l){
listeners.remove(l);
}
public String toString(){ return name; }
}
Interface KeyboardPressedListener digunakan sebagai “kontrak” antara Subject dan Observer. Interface ini menjamin bahwa Observer yang akan memantau event pemasukan kata dari user dalam Subject mempunyai method keyPressed. Method keyPressed ini nanti yang akan dipanggil oleh Subject ketika event pemasukan
kata oleh user terjadi di Subject.
public interface KeyboardPressedListener {
public void keyPressed(KeyboardPressedEvent e);
}
Class Observer mengimplement interface KeyboardPressedListener dan nantinya akan didaftarkan ke subject sebagai Observer. Method keyPressed diimplementasikan dengan mencetak informasi yang diperoleh dari Subject ke standard output.
public class Observer implements KeyboardPressedListener{
private String name;
public Observer(String name){ this.name = name; }
public void keyPressed(KeyboardPressedEvent e) {
System.out.println("print from observer : " +
name + "\n\tevent from : " + e.getSource()
+ "\n\tkey presed is " + e.getWord() );}}
Class KeyboardPressedEvent adalah Java Bean biasa yang menyimpan informasi kejadian pemasukan kata oleh user, didalamnya hanya ada field source dan word serta getter-setter method untuk kedua field tersebut.
public class KeyboardPressedEvent {
private Object source;
private String word;
public Object getSource() { return source; }
public void setSource(Object src) { source = src;}
public String getWord() { return word; }
public void setWord(String wrd) { word = wrd; }
}
Sampai disini, class-class diatas masih berdiri sendiri dan belum ada class yang mempunyai method main. Nah, disinilah kode class MainClass untuk menyatukan semua object diatas menjadi aplikasi utuh.
public class MainClass {
public static void main(String[] str){
Subject subject =
new Subject("subject observed");
Observer observer =
new Observer("first observer");
subject.registerObserver(observer);
subject.runProgram();
}
}
public static void main(String[] str){
Subject subject =
new Subject("subject observed");
Observer observer =
new Observer("first observer");
subject.registerObserver(observer);
subject.runProgram();
}
}
Langkah-langkah dalam menggunakan pattern Observer ini adalah :
1. Membuat object subject dari class Subject
Subject subject = new Subject("subject observed");
2. Membuat object observer dari class Observer
Observer observer = new Observer("first observer");
3. Daftarkan object observer ke object subject
subject.registerObserver(observer);
4. Jalankan program utamanya
subject.runProgram();
Pattern Observer ini digunakan secara intensif dalam komponen swing. Terutama untuk menangangi event dari input peripheral keyboard, mouse, barcode reader yang terjadi di komponen swing JTextField, JButton, JTable Dalam bagian-bagian selanjutnya kita akan belajar bagaimana menangani event pada komponen swing.
Tidak ada komentar:
Posting Komentar