简单来说,观察者模式=发布者+订阅者。
下面是一个有关猎头的典型的例子。在下面这张图当中有两个角色:猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,猎头就会把这个信息通知给曾经向他订阅过的人。

Java代码
Subject接口:
| 1 | publicinterfaceSubject { | 
| 2 |     publicvoidregisterObserver(Observer observer); | 
| 3 |     publicvoidremoveObserver(Observer observer); | 
| 4 |     publicvoidnotifyAllObservers(); | 
Observer接口:
| 1 | publicinterfaceObserver { | 
| 2 |     publicvoidupdate(Subject subject); | 
HeadCounter实现了Subject接口,实际上就是发布者:
| 01 | publicclassHeadCounter implementsSubject { | 
| 03 |     privateList<Observer> observerList; | 
| 04 |     privateList<String> jobList; | 
| 07 |         observerList = newArrayList<Observer>(); | 
| 08 |         jobList = newArrayList<String>(); | 
| 12 |     publicvoidregisterObserver(finalObserver observer) { | 
| 13 |         if(! observerList.contains(observer)){ | 
| 14 |             observerList.add(observer); | 
| 19 |     publicvoidremoveObserver(finalObserver observer) { | 
| 20 |         if(observerList.contains(observer)){ | 
| 21 |             observerList.remove(observer); | 
| 26 |     publicvoidnotifyAllObservers() { | 
| 27 |         for(Observer observer : observerList){ | 
| 28 |             observer.update(this); | 
| 32 |     publicvoidaddJob(finalString job){ | 
| 33 |         this.jobList.add(job); | 
| 37 |     publicList<String> getJobs(){ | 
| 41 |     publicString toString(){ | 
| 42 |         returnjobList.toString(); | 
JobSeeker实现了Observer接口,实际上就是订阅者:
| 01 | publicclassJobSeeker implementsObserver { | 
| 04 |     publicJobSeeker(String name){ | 
| 09 |     publicvoidupdate(Subject subject) { | 
| 10 |         System.out.println(this.name + " got notified!"); | 
| 11 |         System.out.println(subject); | 
程序实例入口:
| 02 |     publicstaticvoidmain(String[] args) { | 
| 03 |         HeadCounter headCounter = newHeadCounter(); | 
| 05 |         headCounter.registerObserver(newJobSeeker("Mike")); | 
| 06 |         headCounter.registerObserver(newJobSeeker("Chris")); | 
| 07 |         headCounter.registerObserver(newJobSeeker("Jeff")); | 
| 09 |         headCounter.addJob("Google Job"); | 
| 10 |         headCounter.addJob("Yahoo Job"); |