Tanım olarak Observer Pattern kapsadığı objeler arasında one-to-many ilişkisi kurar. Böylece bir objenin durumu değiştiğinde, bu objeye bağlı diğer objelere haber verilir ve objeler kendilerini güncellerler.
Sınıf diyagramı aşağıdaki gibidir:

Örneğin bir haber sitesinin abonelik sisteminde iki tür abonelik olsun. Bunlar Mail ve RSS olsun. Mail abonelik sisteminde abonelere haberlerin özet hali mail atılsın. RSS abonelik sisteminde haberlerin özetleri rss standardında oluşturulsun. Abonelerin rss destekli programlari oluşturulan dosyadaki değişiklikleri otomatik olarak takip ettikleri için bizim abonelere mail veya başka bir ileti atmamıza gerek yoktur. Burada iki tane arayüzümüz, Subject ve Observer, dört tane de sınıfımız olacak, Haber, HaberYayinlayicisi, MailAboneleri ve RssAboneleri. Kodlar tam olmasa da aşağıdaki gibi olabilir:
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
public interface Observer {
public void update(List
}
public class HaberYayinlayicisi implements Subject {
private ArrayList
private ArrayList
public HaberYayinlayicisi() {
observers = new ArrayList
haberler = new ArrayList
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(haberler);
}
}
public void yeniHaberlerGeldi() {
notifyObservers();
}
// bu metodu yeni haberleri olusturan baska bir sınıf cagiracak..
public void setYeniHaberler(List
this.haberler = (ArrayList
yeniHaberlerGeldi();
}
}
// Bu sınıf bir tane haberi gösterir.
public class Haber {
private String baslik;
private String ozet;
private String link;
public Haber() {}
// setters-getters, constructors
....
}
// Observer interface'ini implemente eden bir sınıf.
// Abonelerine mail yolu ile haberleri ulaştırır.
public class MailAboneleri implements Observer {
private Subject haberYayinlayicisi;
public MailAboneleri(Subject haberYayinlayicisi) {
this.haberYayinlayicisi = haberYayinlayicisi;
haberYayinlayicisi.registerObserver(this);
}
public void update(List
String mailBody = constructMailBody(haberler);
sendMailToSubscribers(mailBody);
}
/**
* bu metod kayitli tum abonelere mail gonderir.
* Orn: Aboneler veritabanindan cekilebilir.
*/
private void sendMailToSubscribers(String mailBody) {
}
// bu metod gonderilecek mail icerigini olusturur.
private String constructMailBody(List
return "";
}
}
// Bu sınıf da Observer interface'ini implemente eden diger siniftir.
// Abonelerine rss kanali ile haberleri ulaştırır.
public class RssAboneleri implements Observer {
private Subject haberYayinlayicisi;
public RssAboneleri(Subject haberYayinlayicisi) {
this.haberYayinlayicisi = haberYayinlayicisi;
haberYayinlayicisi.registerObserver(this);
}
public void update(List
String rssXml = constructRssXml(haberler);
putXmlToDirectory(rssXml);
}
// bu metod rss standartlarina uygun xml'i uretir.
private String constructRssXml(List
return null;
}
// bu metod uretile xml'i var olan xml dosyasi ile degistirir.
// Aboneler'in kullandiklari rss programlari degisikligi otomatik olarak
// algilarlar...
private void putXmlToDirectory(String rssXml) {
}
}
// Bu sinif da ornek bir calisan sınıftir.
public class Main {
public static void main(String[] args) {
HaberYayinlayicisi haberYayinlayicisi =
new HaberYayinlayicisi();
MailAboneleri mailAboneleri =
new MailAboneleri(haberYayinlayicisi);
RssAboneleri rssAboneleri =
new RssAboneleri(haberYayinlayicisi);
Haber a = new Haber("Olay, olay, olay!!!", "Bina patladi!!!",
"www.habermakinasi.com/?id=5");
Haber b = new Haber("Flas, flas, flas!!!", "Ikinci bina patladi!!!", "www.habermakinasi.com/?id=7");
List
haberler.add(a);
haberler.add(b);
haberYayinlayicisi.setYeniHaberler(haberler);
}
}
Kaynak: Head First Design Patterns