设计模式--观察者(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) 在这里对观察者进行添加和删除操作,并通知观察者

 1 /**
 2  * 被观察者对象(目标/主题对象),注册和删除观察者的接口
 3  *
 4  * @author blacksonny
 5  * @since 2015年7月1日
 6  */
 7 public class Subject {
 8
 9     //保存注册的观察者对象
10     private List<Observer> observers = new ArrayList<Observer>();
11
12     //Attach observer
13     public void attach(Observer o){
14         observers.add(o);
15     }
16
17     //Delete observer
18     public void detach(Observer o){
19         observers.remove(o);
20     }
21
22     //Notify all observer who has register
23     protected void notifyObservers(){
24         for (Observer observer : observers) {
25             observer.update(this);
26         }
27     }
28 }

观察者(Observer)  单目标对象发生变化时,通知这个对象

 1 /**
 2  * 观察者抽象接口,当目标对象发生改变时,通知这个对象
 3  *
 4  * @author blacksonny
 5  * @since 2015年7月1日
 6  */
 7 public interface Observer {
 8
 9     /**
10      * 更新观察者
11      *
12      * @param subject
13      *            被观察者对象,方便获取被观察者状态
14      */
15     void update(Subject subject);
16 }

具体目标对象(ConcreteSubject)  继承Subject,在这里改变自身状态并通知观察者

 1 /**
 2  * 具体的被观察者对象
 3  *
 4  * @author blacksonny
 5  * @since 2015年7月1日
 6  */
 7 public class ConcreteSubject extends Subject {
 8
 9     // 被观察者对象的状态
10     private String subjectState;
11
12     public String getSubjectState() {
13         return subjectState;
14     }
15
16     public void setSubjectState(String subjectState) {
17         this.subjectState = subjectState;
18         this.notifyObservers();//状态发生变化,通知观察者
19     }
20
21 }

观察者实现(ConcreteObserver) 接收被观察者(目标对象)消息,两者状态保持一致

 1 /**
 2  * 具体的观察者对象,实现更新的方法,使自身的状态和被观察者对象状态保持一致
 3  *
 4  * @author blacksonny
 5  * @since 2015年7月1日
 6  */
 7 public class ConcreteObserver implements Observer {
 8     // 观察者对象状态
 9     private String observerState;
10
11     @Override
12     public void update(Subject subject) {
13         observerState = ((ConcreteSubject) subject).getSubjectState();
14
15     }
16
17 }

JAVA自身提供的Observer模型

SalaryConreteSubject被观察者实现,继承自JAVA提供的Observable被观察者
观察者模式对消息的通知分为推、拉两种,推模式由subject发起,通知对象可以相对单一;拉模式由observer主动获取。拉模式就需要subject发送自身对象,而推模式可以是一个简单的数据类型,建议采用拉模式,易扩展。
具体到代码中如下的标注的推方法主动传递一个消息内容 this.notifyObservers(salaryContent); 拉方法则无需传递参数,默认传递this对象 this.notifyObservers();
 1 /**
 2  * 继承自jdk的被观察者
 3  *
 4  * @author blacksonny
 5  * @since 2015年7月1日
 6  */
 7 public class SalaryConreteSubject extends Observable {
 8
 9     private String salaryContent;
10
11     public String getSalaryContent() {
12         return salaryContent;
13     }
14
15     public void setSalaryContent(String salaryContent) {
16         this.salaryContent = salaryContent;
17         //必须调用
18         this.setChanged();
19
20         //推模式
21         this.notifyObservers(salaryContent);
22
23         //拉模式
24         this.notifyObservers();
25     }
26 }
Employee具体观察者, 实现Observer接口,并实现update方法,而其中的两个参数,第一个就是拉模式的参数,第二个为退模式参数
 1 /**
 2  * 实现java.util.Observer
 3  *
 4  * @author blacksonny
 5  * @since 2015年7月1日
 6  */
 7 public class Employee implements Observer {
 8
 9     @Override
10     public void update(Observable o, Object arg) {
11         System.out.println("本月发放工资情况 拉过来:" + ((SalaryConreteSubject) o).getSalaryContent());
12         System.out.println("本月发放工资情况 推过来:" + arg);
13     }
14 }

Client测试:

 1 /**
 2  * 测试java提供的观察者模式
 3  *
 4  * @author blacksonny
 5  * @since 2015年7月1日
 6  */
 7 public class Client {
 8
 9     /**
10      * @param args
11      */
12     public static void main(String[] args) {
13
14         // 创建被观察者对象
15         SalaryConreteSubject subject = new SalaryConreteSubject();
16
17         // 创建观察者对象
18         Employee employee = new Employee();
19         // 注册对象
20         subject.addObserver(employee);
21
22         subject.setSalaryContent("10k");
23     }
24 }

输出结果

本月发放工资情况 拉过来:10k
本月发放工资情况 推过来:10k
时间: 2024-10-10 00:21:13

设计模式--观察者(Observer)的相关文章

Android与设计模式——观察者(Observer)模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式的结构 一个软件系统里面包含了

【设计模式】HeadFirst设计模式(二):观察者(Observer)模式

一.观察者模式定义 在观察者模式中,一个被观察者管理所有依赖于它的观察者对象,它定义了一个一对多的依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新. 主题(被观察者)通过一个共同的接口来更新观察者,观察者依赖于此主题. 二.观察者模式例子--气象监测系统 描述: 气象监测系统分为三个部分:气象站(获取实际气象数据的物理装置).WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看) 布告板分为三个:目前状况(显示Weath

Java设计模式(五) Observer(观察者)模式及Tomcat引申

基本概念 Observer 观察者模式(Observer Pattern)又称为发布订阅模式(Publish/subscribe) 定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并且自动更新 根据单一职责原则,每个类的职责是单一的,我们可以通过触发机制,形成一个触发链,把各个单一的职责串联成真实世界中的复杂的逻辑关系. 观察者模式的角色分工(JDK中提供了抽象接口的定义): Subject被观察者: 抽象类型,定义被观察者必须实现的职责,动态地增加和

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

Head First设计模式之Observer

观察者模式定义对象之间的一对多的依赖,当那一个对象(主题)状态改变时,所有的依赖者(观察者)都会收到通知并作出相应的动作. 观察者模式的使用非常广泛. 代码实现: -------------------主题接口 public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); } --

PHP设计模式-观察者

PHP设计模式-观察者 一个对象状态发生改变后,会影响到其他几个对象的改变,这时候可以用观察者模式.一个对象通过添加一个attach方法允许观察者注册自己,使本身变得可观察.当被观察的对象更改时,它会将消息发送到已注册的观察者.观察者使用该信息执行的操作与被观察的对象无关.观察者模式是一种事件系统,意味着这一模式允许某些类通过观察被观察类的状态变化,做出相应的动作. 观察者模式UML图 php5中提供了观察者observer与被观察者subject接口 interface SplSubject

说说设计模式~观察者模式(Observer)

观察者模式,也叫发布/订阅模式(publish/subscribe),监视器模式等.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.. 何时能用到它? 此种模式通常被用来实现事件处理系统,例如,当一个数据仓储操作中,它的添加功能可能会有一个功能,当添加被触发时,所以订阅了这个添加事件需求的代码 块,都会被触发执行,在这个过程中,数据仓储的添加操作就是被观察者,而所以的订阅者就是它的观察者,发被观察者在某种情况

设计模式——观察者

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,他的所有的依赖者都会收到通知并自动更新: 定义主题,主题的功能是持有观察者的引用,提供注册.取消注册和通知,并且有状态:观察者实现接口中的update方法,必须注册具体主题: JDK自带了对观察者的支持功能 被观察者Observable对象,提供add/delete/notifyObserver()和setChanged()设置状态方法 观察者Observer接口,提供update()方法进行相关的更新操作. 观察者类图: 以下程序模拟