Java设计模式模式观测(Observer Pattern)

时间:2023-03-10 03:14:44
Java设计模式模式观测(Observer Pattern)

Observer Pattern 设计模式通常用于。这是一个事件侦听器模型。

该模型有两个作用,一个是Subject, 有一个Observer。Subject 保存多个Observer参考,一旦一个特定的事件发生。Subject它会通知所有Observer。Observer得到该通知后运行相关程序逻辑。

当中,Observer仅仅有先向Subject注冊后才干被Subject知晓。这就像订报纸,仅仅有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单。然后每当新报纸印好时,出版社会通知订阅者取报纸。这里订阅的用户就是
Observer, 出版社即 Subject。

Subject , Observer的类图例如以下:

Java设计模式模式观测(Observer Pattern)

以下通过一个实例来体会一下观察者模式。

公司须要招聘人才时。往往会去找猎头(headhunter)。猎头知道非常多求职者(applicant)的联系方式。一旦有公司招人。猎头就会给这些求职者打电话,以通过他们有工作能够做了。

在这里面,猎头就是 Subject,求职者就是 Observer。

我们来实现这样一个功能。

设计两个类,HeadHunter 和 Applicant。分别代表猎头和求职者。

HeadHunter 类有一个属性 jobName。当jobName有新的值时(相当于公司要招人)。HeadHunter 就通知他所知道的全部 Applicant 告诉他们有工作了。

类图例如以下:

Java设计模式模式观测(Observer Pattern)

Subject 接口定义:

public interface Subject {
void registerObjserver(Observer ob);
void removeObserver(Observer ob);
void notifyObservers();
}

Observer 接口定义:

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

执行结果:

Java设计模式模式观测(Observer Pattern)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmVvc21pdGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

Observer Pattern 在Swing中应用很广泛,比方调用 JButton 的 addListener() 加入一个事件监听器。此时 JButton 就是 Subject, Listener 就是 Observer。

由于观察者模式比较频繁使用,因此,我们需要把握好经验。

版权声明:本文博主原创文章。博客,未经同意不得转载。