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)的更多相关文章

  1. 面向对象设计模式——观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  2. 设计模式 策略-Strategy,装饰-Decorator,观察者-Observer

    重温了Head First 3个设计模式.提炼一下思想,笔记如下. 策略-Strategy 当一个类或类族中重复实现某些同类的方法(behavior)时,考虑使用策略模式. 该模式是将Behavior ...

  3. 【设计模式】observer(观察者)-- 对象行为型模式5.7

    1.意图 对象之间一对多的依赖关系,当目标对象发生改变时,所有依赖于它的对象都要得到通知并自动更新 2.别名 依赖,发布-订阅 3.动机 1)需要确保相互协作的对象的一致性(数据要保持一致),但一致性 ...

  4. Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式

    观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...

  5. 设计模式C++描述----04.观察者(Observer)模式

    一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于 ...

  6. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  7. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  8. Java 实现观察者(Observer)模式

    1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...

  9. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

随机推荐

  1. 解析Xcode把应用程序打包成ipa---解决打包完新版本itunes提示不是有效应用程序的问题

    Xcode把应用程序打包成ipa是本文要介绍的内容,不多说,先俩看内容.注意:本方法需要先制作假凭证编译于项目中,否则产生的ipa还是无法于iPhone中运行. 制作方法请参考: http://blo ...

  2. JAVA 将接口的引用指向实现类的对象

    有一个很简单的例子,java.util中的类ArrayList实现了接口List则生成ArrayList对象时可用以下语句. List list=new ArrayList(); 也就是说所有实现了接 ...

  3. RIP协议两个版本号对不连续子网的支持情况实验

    (增加时注明"会员咨询")

  4. iOS 蓝牙4.0开发

    背景: 1.iOS的蓝牙不能用来传输文件.2.iOS与iOS设备之间进行数据通信,使用gameKit.framework3.iOS与其他非iOS设备进行数据通信,使用coreBluetooth.fra ...

  5. Codeforces 328A-IQ Test(数列)

    A. IQ Test time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  6. 浅谈Java内存及GC

    目录: 1.JAVA虚拟机规范与JAVA虚拟机 2.JVM结构图 3.GC策略与原理 4.垃圾收集算法 5.回收的时机 6.垃圾搜集器 一.JAVA虚拟机规范与JAVA虚拟机 内存,是指程序运行时的数 ...

  7. 一个小的程序--实现中英文切换(纯css)

    <!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...

  8. (转)强大的JQuery表单验证插件 FormValidator使用介绍

    jQuery formValidator表单验证插件是客户端表单验证插件.在做B/S开发的时候,我们经常涉及到很多表单验证,例如新用户注册,填写个人资料,录入一些常规数据等等.在这之前,页面开发者(J ...

  9. Android-应用的本地化及知识拓展之配置修饰符

    步骤很简单,只需要两步: 1.创建带有目标语言的配置修饰符的资源子目录 2.将可选资源放入该目录下,android系统会自动处理后续工作 在这里我们需要讲解一下配置修饰符. 中文的配置修饰符:-zh, ...

  10. 字符串编码---hash函数的应用

    之前就听说过有个叫做hash表的东西,这段时间在上信息论与编码,也接触了一些关于编码的概念,直到今天做百度之星的初赛的d题时,才第一次开始学并用hash 一开始我用的是mutimap和mutiset, ...