Java设计模式:观察者

    xiaoxiao2024-06-03  98

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

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

    Java代码 Subject接口:

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

    Observer接口:

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

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

    01 public 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接口,实际上就是订阅者:

    01 public 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}

    程序实例入口:

    01 public 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} 转载自 并发编程网 - ifeve.com 相关资源:敏捷开发V1.0.pptx
    最新回复(0)