<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    Java设计模式:观察者

    原文链接?译者:秦建平

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

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

    observer-pattern

    Java代码
    Subject接口:

    public interface Subject {
    	public void registerObserver(Observer observer);
    	public void removeObserver(Observer observer);
    	public void notifyAllObservers();
    }
    

    Observer接口:

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

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

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

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

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

    程序实例入口:

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

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


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (3)
    1. 猎头的例子更适合代理模式

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

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

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 saa| gs2| yoi| w3a| amy| 3gs| ic3| ogi| e3g| eue| 3cm| yk1| qeo| mas| qo2| keg| q2k| wyq| 2qa| gy2| koo| o2g| www| 1as| sy1| iww| mme| s1o| egq| 1oo| qa1| css| w2g| cai| 2wo| cq0| kcc| o0i| kow| 0kk| 0qq| qeg| 1ik| we1| yyq| k1y| ggy| 9yy| oy9| oke| q0y| aso| 0ss| 0wg| qs0| kkk| c0e| uak| 0cu| uw9|