设计模式--观察者(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 版权全部 ...
随机推荐
- UINavigation push 于 present到另一个页面详解
如果页面中没有导航栏,可以present到这个A页面,在A页面想要跳转到有个有导航栏的页面就需要添加给B页面添加一个UINavigationController 然后present到B页面,代码如下 ...
- 【C#基础】CSA控件编写秘籍
新建CSA控件 1.新建一个纯类,命名空间是: namespace SimPerfect.CSAControlLibrary.CSAControls 2.实现两个构造函数:无参和传Candy参数 pu ...
- Android Paint之 setXfermode PorterDuffXfermode 讲解
setXfermodePorterDuffXfermode图层混合模式android图像混合模式AvoidXfermode 尊重原创,欢迎转载,转载请注明: FROM GA_studio htt ...
- HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)
/** 题目大意: 给你一个无向连通图,问加上一条边后得到的图的最少的割边数; 算法思想: 图的边双连通Tarjan算法+树形DP; 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求 ...
- Java基础知识强化57:经典排序之希尔排序(ShellSort)
1. 希尔排序的原理: 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出 ...
- 3、第3课CSS块级、行内元素、绝对定位、相对定位、固定位置20150922
1.块级元素 A:特点: A.1默认显示在父标签的左上角 A.2块级元素默认占满一行(占满整个文档流) B:常见的块级元素 P h1--h6 ul li ol li div h ...
- C#。5 函数 类
函数:能够独立完成某个功能的模块. 好处:1.结构更清析(编写.维护方便 ).2.代码重用.3.分工开发. 四要素:名称,输入(参数),输出(返回的类型),加工(函 ...
- HQL查询
HQL ,Hibernate Query Language ,是Hibernate查询语言,不直接操作数据表,而是操作实体类,根据实体类和对应数据表中的映射关系,查找数据. 下面是hql的基本步骤: ...
- NET下三种缓存机制(Winform里面的缓存使用 )
原文(http://www.cnblogs.com/wuhuacong/p/3526335.html)非常感谢伍华聪作者的分享! 缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度 ...
- C#程序调用cmd执行命令(转)
C#通过程序来调用cmd命令的操作 string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Diagnos ...