标签:
Observer Pattern 设计模式通常用于。这是一个事件侦听器模型。
该模型有两个作用,一个是Subject, 有一个Observer。Subject 保存多个Observer参考,一旦一个特定的事件发生。Subject它会通知所有Observer。Observer得到该通知后运行相关程序逻辑。
当中,Observer仅仅有先向Subject注冊后才干被Subject知晓。这就像订报纸,仅仅有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单。然后每当新报纸印好时,出版社会通知订阅者取报纸。这里订阅的用户就是 Observer, 出版社即 Subject。
Subject , Observer的类图例如以下:
以下通过一个实例来体会一下观察者模式。
公司须要招聘人才时。往往会去找猎头(headhunter)。猎头知道非常多求职者(applicant)的联系方式。一旦有公司招人。猎头就会给这些求职者打电话,以通过他们有工作能够做了。
在这里面,猎头就是 Subject,求职者就是 Observer。
我们来实现这样一个功能。
设计两个类,HeadHunter 和 Applicant。分别代表猎头和求职者。
HeadHunter 类有一个属性 jobName。当jobName有新的值时(相当于公司要招人)。HeadHunter 就通知他所知道的全部 Applicant 告诉他们有工作了。
类图例如以下:
Subject 接口定义:
public interface Subject { void registerObjserver(Observer ob); void removeObserver(Observer ob); void notifyObservers(); }
public interface Observer { void update(Subject subject); }
public class HeadHunter implements Subject { private List<Observer> obList = new ArrayList<Observer>(); private boolean isNotify = true; private String jobName; /** * 注冊一个Observer */ @Override public void registerObjserver(Observer ob) { obList.add(ob); } /** * 移除一个Observer */ @Override public void removeObserver(Observer ob) { obList.remove(ob); } /** * 通知全部的Observer */ @Override public void notifyObservers() { if (true == isNotify) { performNotify(); isNotify = false; } } /** * 加入一个新的工作。加入完毕后立即通知全部Observer * @param jobName */ public void setJobName(String jobName) { this.jobName = jobName; isNotify = true; notifyObservers(); } private void performNotify() { for (Observer ob : obList) { ob.update(this); } } public String getJobName() { return jobName; } }
public class Applicant implements Observer { private String name; public Applicant(String name) { this.name = name; } @Override public void update(Subject subject) { HeadHunter h = (HeadHunter)subject; out.println(name + "收到通知:" + h.getJobName()); } }
这个小程序的功能是,一旦 HeadHunter 的 setJobName() 方法被调用(即有新工作),HeadHunter 立即通知它的 Applicant 告诉他们有工作了。程序測试代码例如以下:
public static void main(String[] args) { HeadHunter hh = new HeadHunter(); // 注冊observer hh.registerObjserver(new Applicant("张三")); hh.registerObjserver(new Applicant("李四")); hh.registerObjserver(new Applicant("王五")); // 加入一个job // 此时全部observer的update()方法都会被调用 hh.setJobName("Java程序猿"); }
Observer Pattern 在Swing中应用很广泛,比方调用 JButton 的 addListener() 加入一个事件监听器。此时 JButton 就是 Subject, Listener 就是 Observer。
由于观察者模式比较频繁使用,因此,我们需要把握好经验。
版权声明:本文博主原创文章。博客,未经同意不得转载。
Java设计模式模式观测(Observer Pattern)
标签:
原文地址:http://www.cnblogs.com/hrhguanli/p/4802532.html