Java设计模式:观察者

原文链接 译者:秦建平

简单来说,观察者模式=发布者+订阅者。

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

observer-pattern

Java代码
Subject接口:

[code lang=”java”]
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyAllObservers();
}
[/code]

Observer接口:

[code lang=”java”]
public interface Observer {
public void update(Subject subject);
}
[/code]

HeadCounter实现了Subject接口,实际上就是发布者:

[code lang=”java”]
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();
}
[/code]

JobSeeker实现了Observer接口,实际上就是订阅者:

[code lang=”java”]
public class JobSeeker implements Observer {
private String name;

public JobSeeker(String name){
this.name = name;
}

@Override
public void update(Subject subject) {
System.out.println(this.name + " got notified!");
System.out.println(subject);
}
}
[/code]

程序实例入口:

[code lang=”java”]
public class Main {
public static void main(String[] args) {
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");
}
}
[/code]

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java设计模式:观察者

  • Trackback 关闭
  • 评论 (3)
  1. 猎头的例子更适合代理模式

    • 求职者找工作的时候,猎头只是一个途径,并不一定非要找猎头帮忙推荐,所以也就不一定非要让猎头做为代理

  2. 猎头这个例子不错,其实还可以举点具体的例子

return top