* 简单来说,观察者模式=发布者+订阅者。下面是一个有关猎头的典型的例子。在下面这张图当中有两个角色:
* 猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,
* 猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,
* 猎头就会把这个信息通知给曾经向他订阅过的人。
猎头接口:
package com.pattern.observer;
/**
* @author Qixuan.Chen
* 创建时间:2014年9月2日
*/
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyAllObservers();
}
订阅者接口:
package com.pattern.observer;
/**
* @author Qixuan.Chen
* 创建时间:2014年9月2日
*/
public interface Observer {
//观察者更新
public void update(Subject subject);
}
猎头实现类:
package com.pattern.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author Qixuan.Chen
* 创建时间:2014年9月2日
* 猎头类
*/
public class HeadCounter implements Subject {
private List<Observer> observerList;
private List<String> jobList;
public HeadCounter(){
observerList = new ArrayList<Observer>();
jobList = new ArrayList<String>();
}
//实现接口的方法
//获取已注册的人员
@Override
public void registerObserver(final Observer observer) {
if(! observerList.contains(observer)){
observerList.add(observer);
}
}
//删除已注册的人员
@Override
public void removeObserver(final Observer observer) {
if(observerList.contains(observer)){
observerList.remove(observer);
}
}
//通知
@Override
public void notifyAllObservers() {
for(Observer observer : observerList){
observer.update(this);
}
}
//增加新工作
public void addJob(final String job){
this.jobList.add(job);
notifyAllObservers();
}
//获取工作
public List<String> getJobs(){
return jobList;
}
public String toString(){
return jobList.toString();
}
}
订阅者实现类:
package com.pattern.observer;
/**
* @author Qixuan.Chen
* 创建时间:2014年9月2日
* 订阅者类
*/
public class JobSeeker implements Observer{
private String name;//订阅者姓名
public JobSeeker(String name){
this.name = name;
}
//实现接口的方法
public void update(Subject subject) {
System.out.println("----给-------"+this.name + "------发通知");
System.out.println(subject);
}
}
测试类:
package com.pattern.observer;
/**
* @author Qixuan.Chen
* 创建时间:2014年9月2日
* 简单来说,观察者模式=发布者+订阅者。下面是一个有关猎头的典型的例子。在下面这张图当中有两个角色:
* 猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,
* 猎头就会把这个信息通知给曾经向他订阅过的人。
*
* 两接口,两实现,一测试
*/
public class TestDemo {
public static void main(String[] args) {
System.out.println("----------程序入口------------");
HeadCounter headCounter = new HeadCounter();
//注册订阅者
headCounter.registerObserver(new JobSeeker("Mike"));
headCounter.registerObserver(new JobSeeker("Chris"));
headCounter.registerObserver(new JobSeeker("Jeff"));
//通知所有订阅者有新的工作机会
headCounter.addJob("Google Job");
headCounter.addJob("Yahoo Job");
}
}