设计模式--观察者(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 版权全部 ...
随机推荐
- 关于使用axis调用webservice接口方法
1.概述: 我们有时候会调用webserviec接口,我们向接口发送请求参数,从接口接收返回值. 2.形式: package client; import org.apache.axis.client ...
- c\c++复习基础要点08--c++单例模式
单例模式有许多种实现方法,在c++中,甚至可以直接用一个全局变量做到这一点,但是这样的代码显得不优雅.使用全局对象能够保证方便地访问实例,但是不能保证只声明一个对象——也就是说除了一个全局实例外,仍然 ...
- C语言排序算法复习
排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔 ...
- MVC三和,你能辨别它?
上次我们聊的时间MVC,而之前我们学习过三层.那么我们不禁就要问,他们说的是一回事吗.他们有什么联系吗? 三层架构(3-tier application)通常意义上的三层架构就是将整个业务应用划分为: ...
- SUSE 在Intel举行"Rule The Stack"的竞赛中获得 "Openstack安装最高速"奖
有关"Rule The Stack": https://communities.intel.com/community/itpeernetwork/datastack/blog/2 ...
- java开发webservice的几种方式
webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2 Axis是apache下一个开源的webservice开发组件 ...
- 使用Mina框架开发 QQ Android 客户端
Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步AP ...
- eclipse与github建立版本关联、git使用说明
1.在eclipse下建一个project :aa 2.打开git bush,进入aa目录下:cd /d/MyWorkspace/aa 3.git init 4.git add -A 5.git co ...
- 1:环境安装与介绍:canopy
<利用python进行数据分析>这本书推荐用的的环境为EPDFree版本,但实际现在大概已经抛弃它改用Canopy了,下面将介绍Canopy相关: 一:下载:https://store.e ...
- Visual Studio 2015 RC Downloads
https://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs