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)


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

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

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