设计模式--观察者(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 版权全部 ...
随机推荐
- 关于IE8导航串行的问题
1.概述: 作为一个前端人员,多浏览器兼容是必须必备的技能,现在一般要求是兼容IE8及以上,如果兼容IE6的话,会麻烦一些,这里介绍的是在IE8状态下我们导航条错位的问题. 2.导航错位代码 < ...
- AlwaysON同步过程
<SQL Server 2012实施与管理实战指南>中指AlwaysON同步过程如下: 任何一个SQL Server里都有个叫Log Writer的线程,当任何一个SQL用户提交一个数据修 ...
- (一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换
一个工作任务涉及到c#与c++系统间的udp通信,处理了蛮长时间没有完成任务,但是期间接触到不少小知识点.本人是初接触c#,c++语言没有接触过.可能写的东西都很小儿科,暂且记录下来当工作日记把. 先 ...
- NHibernate——基本映射(5)
一.映射定义概括 1.1 映射定义(Mapping declaration) 对象和关系数据库之间的映射是用一个XML文档(XML document)来定义的.这个映射文档被设计为易读的,并且可以手工 ...
- 关于在css里设置图片圆角的问题
今天做了一个项目,效果图内页的产品图片都是带圆角的,于是前端的做了圆角的效果,div+css是这样的,首先div布局是: <div class="tiandi_item" o ...
- Swift中子类必须包含的构造器和析构器
import Foundation /* Swift中子类必须包含的构造器 1.Swift允许在父类构造器前添加required关键字, 用于声明所有子类必须包含该required构造器 (如果没有声 ...
- C#析构函数,类运行结束后运行
public class Students { //创建对像时使用 public Students(string name, int age, char gender, int englist, in ...
- angular请求传递不了数据
var data={ 'id':ztreeParent.id } $http({ url:'/rcCategoryControler/deleteRcCategoryById', method:'GE ...
- traceroute小结 come from CSDN author:houdong
traceroute程序可以使我们看到IP数据报从一台主机传到另一台主机的所经过的路由,并且可以使用IP源站路由选项. traceroute取代IP RR的原因 1 不是所有的路由器都支持IP RR选 ...
- Guava API学习之Preconditions优雅的检验参数 编辑
在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按照正常流程执行下去.对于可预知的一些数据上的错误,我们一定要做 事前检测和判断,来避免程序流程出错,而不是完全通过错误 ...