观察者模式描述的是事件的通知方式,可用于“订阅-分发”、“监听器”等场景,一个主题对象发生变化时通知所有的观察者进行相应的处理。
JDK自身内置了观察者模式实现,可以直接使用JDK自身的观察者模式!
场景:求职者可以向猎头注册登记,猎头在有工作的时候通知求职者。
设计:
示例代码:
import java.util.ArrayList;
import java.util.List;
interface JobSeeker {
void assessJob(String job);
}
interface HeadHunter{
void registerJobSeeker(JobSeeker jobSeeker);
void removeJobSeeker(JobSeeker jobSeeker);
void addJob(String job);
void notifyAllJobSeekers();
}
class HeadHunterCompany implements HeadHunter {
private List<JobSeeker> jobSeekers = new ArrayList<JobSeeker>();
private String job;
public void registerJobSeeker(JobSeeker jobSeeker) {
jobSeekers.add(jobSeeker);
}
public void removeJobSeeker(JobSeeker jobSeeker) {
jobSeekers.remove(jobSeeker);
}
public void addJob(String job) {
this.job = job;
System.out.println("添加新工作:" + job);
notifyAllJobSeekers();// 关键:通知求职者。
}
public void notifyAllJobSeekers() {
for (JobSeeker jobSeeker : jobSeekers) {
jobSeeker.assessJob(job);
}
}
}
class Mike implements JobSeeker {
public void assessJob(String job) {
System.out.println("Mike 查看工作: " + job);
}
}
class Lucy implements JobSeeker {
public void assessJob(String job) {
System.out.println("Lucy 查看工作: " + job);
}
}
public class Test {
public static void main(String[] args) {
HeadHunter headHunter = new HeadHunterCompany();
headHunter.registerJobSeeker(new Mike());
headHunter.registerJobSeeker(new Lucy());
headHunter.addJob("研发工程师职位");
headHunter.addJob("行政专员职位");
}
}
输出:
添加新工作:研发工程师职位
Mike 查看工作: 研发工程师职位
Lucy 查看工作: 研发工程师职位
添加新工作:行政专员职位
Mike 查看工作: 行政专员职位
Lucy 查看工作: 行政专员职位
使用JDK的观察者模式实现:
import java.util.Observable;
import java.util.Observer;
class HeadHunterCompany extends Observable {
private String job;
public void addJob(String job) {
this.job = job;
System.out.println("添加新工作:" + job);
// 关键:通知求职者。
setChanged();
// notifyObservers();
notifyObservers(this.job);
}
@Override
public String toString() {
return "猎头公司";
}
}
class Mike implements Observer {
public void update(Observable o, Object arg) {
System.out.println("Mike 收到来自 " + o + " 的工作: " + arg);
}
}
class Lucy implements Observer {
public void update(Observable o, Object arg) {
System.out.println("Lucy 收到来自 " + o + " 的工作: " + arg);
}
}
public class Test {
public static void main(String[] args) {
HeadHunterCompany headHunter = new HeadHunterCompany();
headHunter.addObserver(new Mike());
headHunter.addObserver(new Lucy());
headHunter.addJob("研发工程师职位");
headHunter.addJob("行政专员职位");
}
}
输出:
添加新工作:研发工程师职位
Lucy 收到来自 猎头公司 的工作: 研发工程师职位
Mike 收到来自 猎头公司 的工作: 研发工程师职位
添加新工作:行政专员职位
Lucy 收到来自 猎头公司 的工作: 行政专员职位
Mike 收到来自 猎头公司 的工作: 行政专员职位