paulwong

Java设计模式:观察者

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

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

observer-pattern

Java代码
Subject接口:

1public interface Subject {
2    public void registerObserver(Observer observer);
3    public void removeObserver(Observer observer);
4    public void notifyAllObservers();
5}

Observer接口:

1public interface Observer {
2    public void update(Subject subject);
3}

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

01public class HeadCounter implements Subject {
02 
03    private List<Observer> observerList;
04    private List<String> jobList;
05 
06    public HeadCounter(){
07        observerList = new ArrayList<Observer>();
08        jobList = new ArrayList<String>();
09    }
10     
11    @Override
12    public void registerObserver(final Observer observer) {
13        if(! observerList.contains(observer)){
14            observerList.add(observer);
15        }
16    }
17 
18    @Override
19    public void removeObserver(final Observer observer) {
20        if(observerList.contains(observer)){
21            observerList.remove(observer);
22        }
23    }
24 
25    @Override
26    public void notifyAllObservers() {
27        for(Observer observer : observerList){
28            observer.update(this);
29        }
30    }
31     
32    public void addJob(final String job){
33        this.jobList.add(job);
34        notifyAllObservers();
35    }
36     
37    public List<String> getJobs(){
38        return jobList;
39    }
40 
41    public String toString(){
42        return jobList.toString();
43    }

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

01public class JobSeeker implements Observer {
02    private String name;
03     
04    public JobSeeker(String name){
05        this.name = name;
06    }
07     
08    @Override
09    public void update(Subject subject) {
10        System.out.println(this.name + " got notified!");
11        System.out.println(subject);
12    }
13}

程序实例入口:

01public class Main {
02    public static void main(String[] args) {
03        HeadCounter headCounter = new HeadCounter();
04                //注册订阅者
05        headCounter.registerObserver(new JobSeeker("Mike"));
06        headCounter.registerObserver(new JobSeeker("Chris"));
07        headCounter.registerObserver(new JobSeeker("Jeff"));
08        //通知所有订阅者有新的工作机会
09        headCounter.addJob("Google Job");
10        headCounter.addJob("Yahoo Job");
11    }
12}

posted on 2014-08-26 08:50 paulwong 阅读(286) 评论(0)  编辑  收藏 所属分类: Design Pattern


只有注册用户登录后才能发表评论。


网站导航: