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离开教室. 要求使用设计模式的思想完成铃与学 ...
随机推荐
- xhprof failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
wget http://www.graphviz.org/pub/graphviz/ARCHIVE/graphviz-2.28.0.tar.gz tar xzvf graphviz-2.28.0.ta ...
- MySql学习之varchar类型
MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定),在 MySQL5.0以上的版本中,varchar数据 ...
- iReport 4.1 报表制作,子报表,实例解析
开发使用步骤(iReport 4.1.1) (个人总结,如有问题请留言,另外知道table控件用法的给我留言或者发邮件谢谢.Email:jiazx0107@163.com) 目录 1. 开发 ...
- uva424 高精度计算
题意是计算各长整数的和,最多输入100个数,每个数都是正整数且位数不超过100. 很明显100位的数用数组存会方便许多,然后设置两个整型数组,一个存进位,一个存结果.为了对齐进行运算,我将所有的数先逆 ...
- 使用反射类、Class类获取指定的构造器并实例化对象
package com.test; public class Car { private String brand; private String color; private int maxSpee ...
- PDO简介
php链接数据库 半年后需要更换mysql为集群模式或者有钱了升级oracl数据库,这时的改动相当大,成本高.如果再之前使用PDO,之后再遇见这样的问题就很轻松. 开启PDO: 打开php.ini文件 ...
- JSTL与EL常用标签(转)
JSTL与EL EL相关概念 JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程 ...
- Javascript实现DIV的隐藏和出现
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- android ListView的上部下拉刷新下部点击加载更多具体实现及拓展
android ListView的上部下拉刷新下部点击加载更多具体实现及拓展 ListView下拉刷新,上拉自动加载更多 下拉刷新以及加载更多
- java字符串函数及理解
Java中的字符串也是一连串的字符.但是与许多其他的计算机语言将字符串作为字符数组处理不同,Java将字符串作为String类型对象来处理.将字符串作为内置的对象处理允许Java提供十分丰富的功能特性 ...