Java设计模式模式观测(Observer Pattern)
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程序猿");
}
执行结果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmVvc21pdGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Observer Pattern 在Swing中应用很广泛,比方调用 JButton 的 addListener() 加入一个事件监听器。此时 JButton 就是 Subject, Listener 就是 Observer。
由于观察者模式比较频繁使用,因此,我们需要把握好经验。
版权声明:本文博主原创文章。博客,未经同意不得转载。
Java设计模式模式观测(Observer Pattern)的更多相关文章
- 深入浅出设计模式——观察者模式(Observer Pattern)
模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...
- java设计模式解析(1) Observer观察者模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 设计模式-观察者模式(Observer Pattern)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 观察者模式简述 观察者模式的使用非常广泛,常用于建立起一种多对一的关系,该模式一定会包含两个角色 ...
- 二十四种设计模式:观察者模式(Observer Pattern)
观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...
- 设计模式15---观察者模式(Observer Pattern)
一.观察者模式定义 观察者模式定义: Define a one-to-many dependency between objects so that when one object changes s ...
- 24种设计模式--观察者模式【Observer Pattern】
<孙子兵法>有云: “知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好 ...
- JAVA设计模式之观察者模式 - Observer
有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...
- 设计模式之观察者模式(Observer pattern)
最近参加了一次面试,其中笔试题有一道编程题,在更换掉试题的描述场景后,大意如下: 上课铃声响起,学生A/B/C/D进入教室:下课铃声响起,学生A/B/C/D离开教室. 要求使用设计模式的思想完成铃与学 ...
随机推荐
- BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )
裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树 ...
- 请求http服务
①服务方法 [HttpGet]//get服务 public JsonResult GetUserName(int id) { try { IXiao_UserBLL bll = new Xiao_Us ...
- Listview 多个ViewHolder实现
简单代码示例: package com.edaixi.adapter; import android.content.Context; import android.view.View; import ...
- C语言迭代求解
date : 2013/8/12 desinger :pengxiaoen 今天看 国外电子信息科学经典教材系列 <电子电路分析与设计> 电子工业出版社的 的19 ...
- Android多线程任务优化1:探讨AsyncTask的缺陷
AsyncTask还有别的缺陷,在生成listview的时候,如果adapter里面的count动态改变的话,不能使用AsyncTask,只能使用Thread+Handler,否则会出现如下错误 j ...
- Finding the Longest Palindromic Substring in Linear Time
Finding the Longest Palindromic Substring in Linear Time Finding the Longest Palindromic Substring i ...
- BaseAdapter使listview设置不同背景图片并添加selector
前段时间为了实现根据item不同的内容实现不同的背景色google了好久只找到了个隔行换色,通过自定义SimpleAdapter终于实现了此功能,但是定义了selector并没有触发点击效果.今天重新 ...
- 很郁闷,七日筑基C#第二天的内容未保存
很郁闷,七日筑基C#第二天的内容写了好几百字未保存,刚才死机了,一下打击得不行了.
- JavaSE复习日记 : 算是个小前言吧
/* * Java也学了好久了,抽个时间整理了一下课堂笔记,也有些是我刚开始学会犯的一些错误.在这里浅谈一下JavaSE的基础内容,对我来说也是一种不错的复习方式. * * 那好,对于初学者来说,学习 ...
- 五毛的cocos2d-x学习笔记07-计时器、数据读写、文件读写
调度器: 定时任务是通过调度器实现的.cocos2d-x推荐用调度器而不是其他方法实现定时任务.Node类都知道如何调度和取消调度事件. 有3种调度器: 默认调度器:schedulerUpdate() ...