首页 > 代码库 > Java设计模式-------观察者模式

Java设计模式-------观察者模式

* 简单来说,观察者模式=发布者+订阅者。下面是一个有关猎头的典型的例子。在下面这张图当中有两个角色:
 * 猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,

 * 猎头就会把这个信息通知给曾经向他订阅过的人。

猎头接口:

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");
	 }

}

Java设计模式-------观察者模式