Java设计模式之观察者模式(Observer Pattern)

50 篇文章 11 订阅
2 篇文章 0 订阅

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

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



运行结果:



Observer Pattern 在Swing中应用非常广泛,比如调用 JButton 的 addListener() 添加一个事件监听器,此时 JButton 就是 Subject, Listener 就是 Observer。由于观察者模式比较常用,所以需要我们好好体会掌握。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
环境:Windows XP professional, JDK 1.6, Eclipse 3.3 Europa. 我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想,但是不是知道是什么OO思想?(个人观点,请勿激动)。 该示例是翻写一老外Observer Pattern的例子,本人觉得该示例是对该模式的非常精典的说明,于是花点功夫来翻写它,因为他的代码没有注释说明该模式的设计思想怎样体现在代码中去,所以,本人结合代码注释了关键代码的中文意义说明作者怎样表示该设计模式的,以方便Java程序员阅读和理解代码,从而理解该设计模式的思想(本人的注释非常详尽)。 目的,本人认为,作为Java程序员--不是指只会使用JBuilder(或者Websphare等)工具拖拽的java操作员--我们指至少能使用Eclipse工具书写Swing代码的Java编程员,或者使用ant工具编程的Java程序员,应该熟练掌握该设计模式!因为该设计模式贯穿Swing框架的始终。 阅读对象:本锦江中心中从S1阶段就想成为一个Java程序员的学员,并且在S1阶段已经非常认真的学习Java编程的学员。 注:不过该代码应该是本锦江中心Y2阶段Java方向学习的学员的参考代码,因为,该代码是由Y2阶段本教员会讲解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值