设计模式--观察者(Observer)
GOF给出的定义:
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
定义了对象之间的一种一对多的依赖关系,这样,当一个对象的状态发生变化时,所有的依赖对象都被通知并自动更新。
包含观察者与被观察者(也称为主题)
使用场景:
1、有两个抽象类型相互依赖。将他们封装在各自的对象中,就可以对它们单独进行改变和复用。
2、对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
3、一个对象必须通知其他对象,而它又不需知道其他对象是什么。
观察这模式的结构(UML)

标准实现:
目标/被观察者(Subject) 在这里对观察者进行添加和删除操作,并通知观察者
/**
* 被观察者对象(目标/主题对象),注册和删除观察者的接口
*
* @author blacksonny
* @since 2015年7月1日
*/
public class Subject { //保存注册的观察者对象
private List<Observer> observers = new ArrayList<Observer>(); //Attach observer
public void attach(Observer o){
observers.add(o);
} //Delete observer
public void detach(Observer o){
observers.remove(o);
} //Notify all observer who has register
protected void notifyObservers(){
for (Observer observer : observers) {
observer.update(this);
}
}
}
观察者(Observer) 单目标对象发生变化时,通知这个对象
/**
* 观察者抽象接口,当目标对象发生改变时,通知这个对象
*
* @author blacksonny
* @since 2015年7月1日
*/
public interface Observer { /**
* 更新观察者
*
* @param subject
* 被观察者对象,方便获取被观察者状态
*/
void update(Subject subject);
}
具体目标对象(ConcreteSubject) 继承Subject,在这里改变自身状态并通知观察者
/**
* 具体的被观察者对象
*
* @author blacksonny
* @since 2015年7月1日
*/
public class ConcreteSubject extends Subject { // 被观察者对象的状态
private String subjectState; public String getSubjectState() {
return subjectState;
} public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
this.notifyObservers();//状态发生变化,通知观察者
} }
观察者实现(ConcreteObserver) 接收被观察者(目标对象)消息,两者状态保持一致
/**
* 具体的观察者对象,实现更新的方法,使自身的状态和被观察者对象状态保持一致
*
* @author blacksonny
* @since 2015年7月1日
*/
public class ConcreteObserver implements Observer {
// 观察者对象状态
private String observerState; @Override
public void update(Subject subject) {
observerState = ((ConcreteSubject) subject).getSubjectState(); } }
JAVA自身提供的Observer模型
SalaryConreteSubject被观察者实现,继承自JAVA提供的Observable被观察者
观察者模式对消息的通知分为推、拉两种,推模式由subject发起,通知对象可以相对单一;拉模式由observer主动获取。拉模式就需要subject发送自身对象,而推模式可以是一个简单的数据类型,建议采用拉模式,易扩展。
具体到代码中如下的标注的
推方法主动传递一个消息内容 this.notifyObservers(salaryContent);
拉方法则无需传递参数,默认传递this对象 this.notifyObservers();
/**
* 继承自jdk的被观察者
*
* @author blacksonny
* @since 2015年7月1日
*/
public class SalaryConreteSubject extends Observable { private String salaryContent; public String getSalaryContent() {
return salaryContent;
} public void setSalaryContent(String salaryContent) {
this.salaryContent = salaryContent;
//必须调用
this.setChanged(); //推模式
this.notifyObservers(salaryContent); //拉模式
this.notifyObservers();
}
}
Employee具体观察者, 实现Observer接口,并实现update方法,而其中的两个参数,第一个就是拉模式的参数,第二个为退模式参数
/**
* 实现java.util.Observer
*
* @author blacksonny
* @since 2015年7月1日
*/
public class Employee implements Observer { @Override
public void update(Observable o, Object arg) {
System.out.println("本月发放工资情况 拉过来:" + ((SalaryConreteSubject) o).getSalaryContent());
System.out.println("本月发放工资情况 推过来:" + arg);
}
}
Client测试:
/**
* 测试java提供的观察者模式
*
* @author blacksonny
* @since 2015年7月1日
*/
public class Client { /**
* @param args
*/
public static void main(String[] args) { // 创建被观察者对象
SalaryConreteSubject subject = new SalaryConreteSubject(); // 创建观察者对象
Employee employee = new Employee();
// 注册对象
subject.addObserver(employee); subject.setSalaryContent("10k");
}
}
输出结果
本月发放工资情况 拉过来:10k
本月发放工资情况 推过来:10k
设计模式--观察者(Observer)的更多相关文章
- 面向对象设计模式——观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- 设计模式 策略-Strategy,装饰-Decorator,观察者-Observer
重温了Head First 3个设计模式.提炼一下思想,笔记如下. 策略-Strategy 当一个类或类族中重复实现某些同类的方法(behavior)时,考虑使用策略模式. 该模式是将Behavior ...
- 【设计模式】observer(观察者)-- 对象行为型模式5.7
1.意图 对象之间一对多的依赖关系,当目标对象发生改变时,所有依赖于它的对象都要得到通知并自动更新 2.别名 依赖,发布-订阅 3.动机 1)需要确保相互协作的对象的一致性(数据要保持一致),但一致性 ...
- Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式
观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...
- 设计模式C++描述----04.观察者(Observer)模式
一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 设计模式 - 观察者模式(Observer Pattern) 详细说明
观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
- Java 实现观察者(Observer)模式
1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...
- 设计模式 - 观察者模式(Observer Pattern) 详细解释
观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
随机推荐
- EBuild-API常见问题汇总
问题1:用户访问被防火墙屏蔽检查处理流程 E-Build API(原IBE)是面向航空公司和代理人,以及第三方的航空预订服务产品.用户通过客户端,使用固定IP访问E-Build API服务器,航信网络 ...
- 【ArcGIS 10.2新特性】地理数据(Geodatabase 和database)10.2 新特性
1. 大数据支持 ArcGIS与Hadoop集成,将提供一个开源的工具包用于大数据的空间分析,开发者将通过该工具包构建定制化的工作流并在ArcGIS当中执行. 支持更多的大数据平台数据 ...
- MySQL数据库的双向加密方式
如果你正在运行使用MySQL的Web应用程序,那么你把密码或者其他敏感信息保存在应用程序里的机会就很大.保护这些数据免受或者窥探者的获取 是一个令人关注的重要问题,因为您既不能让未经授权的人员使用或者 ...
- Eclipse 添加快捷方式
1.在/usr/share/applications创建一个desktop文件,命名为eclipse.desktop 文件内容如下 [Desktop Entry]Name=EclipseType=Ap ...
- CentOS yum Fatal Error 处理一例
环境说明 [root@thatsit ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@thatsit ~]# uname - ...
- Aspose.Words导出dt到word的问题
已解决:单挑数据导入到一个word文档,导出文字和图片成功,执行Main();方法导出dt到word 待解决:多条数据(文字,图片的导入到一个word文档里面)从dt导入到word;已发现的错误提示“ ...
- oracle rac 数据库常用命令
oracle rac 数据库常用命令:1.所有实例和服务的状态srvclt status database -d orcl单个实例的状态:srvctl status instance -d orcl ...
- 什么是 Terminal
从用户的角度来看,Terminal 是键盘和显示器的组合,也称为 TTY(电传打字机的缩写).键盘输入字符,显示器显示字符. 从进程的角度来看,终端是字符设备,可以通过 read.write.ioct ...
- ClustrMaps——访问者位置
ClustrMaps——访问者位置: http://www3.clustrmaps.com/zh/counter/maps.php?url=http://www.cnblogs.com/JuneZha ...
- php魔术方法——构造函数和析构函数
php有一类很神奇的方法,这些方法是保留方法,通常不会在外部被显式调用,他们使用双下划线(__)开头,他们被称为魔术方法(Magic Methods).php官方也不建议定义其他双下划线开头的方法. ...