Head First设计模式之Observer

观察者模式定义对象之间的一对多的依赖,当那一个对象(主题)状态改变时,所有的依赖者(观察者)都会收到通知并作出相应的动作。

观察者模式的使用非常广泛。

代码实现:

-------------------主题接口

public interface Subject
{

public void registerObserver(Observer o);

public void removeObserver(Observer o);

public void notifyObservers();

}

---------- 具体主题

public class WeatherData implements Subject{

private ArrayList<Observer>  observers ;

private float temperature ;

private float humidity ;

private float pressure ;

public WeatherData(){

this .observers = new ArrayList<Observer>();

}

@Override

public void registerObserver(Observer
o) {

this .observers .add(o);

}

@Override

public void removeObserver(Observer
o) {

int i
= observers .indexOf(o);

if (i
>= 0){

observers .remove(i);

}

}

@Override

public void notifyObservers()
{

for (int i=0;
i< observers.size(); i++){

Observer o = observers .get(i);

o.update( this .temperature , this. humidity, this .pressure );

}

}

//当测量数据发送改变时,就通知这些观察者;

public void measurementChanged(){

notifyObservers();

}

//模拟实时监测数据的改变

public void setMeasurement( float temperature, float humidity, float pressure){

this .temperature =
temperature;

this .humidity =
humidity;

this .pressure =
pressure;

measurementChanged();

}

}

-----------------观察者接口

public interface Observer
{

public void update(float temp, float humidity, float pressure);

}

-----------辅助接口

public interface DisplayElement
{

public void display();

//布告板显示的时候调用这个方法;

}

--------------具体观察者

//当前天气状况布告板

public class CurrentConditionDisplay implements Observer,
DisplayElement{

private float temperature ;

private float humidity ;

private Subject weatherData ;

//用WeatherData作为构造器参数,作为注册之用

public CurrentConditionDisplay(Subject
weatherData){

this .weatherData =
weatherData;

weatherData.registerObserver( this );

}

@Override

public void display()
{

System. out .println("CurrentConditionDisplay:
" + this .temperature + "
F degrees and "

this .humidity + "%
humidity..");

}

@Override

public void update(float temp, float humidity, float pressure)
{

//先把状态改变保存起来,而后进行业务处理(显示)

this .temperature =
temp;

this .humidity =
humidity;

display();

}

}

------------

//测试程序,其他的布告板实现也是类似的

public class WeatherStation
{

public static void main(String[]
args) {

WeatherData data = new WeatherData();

CurrentConditionDisplay ccd = new CurrentConditionDisplay(data);

//改变主题状态

data.setMeasurement(80, 50, 100);

}

}

Head First设计模式之Observer

时间: 2024-08-09 10:35:28

Head First设计模式之Observer的相关文章

设计模式 - 观察者模式(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(可被观

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

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

设计模式之Observer Pattern

Declaration 首先声明, 本篇blog的内容是参考Design pattern FAQ Part 2 (Design pattern training series)这篇博文写的, 图片也是来自这篇博客. 部分是翻译, 加上自己的理解形成这篇博文. 希望和大家一起学习设计模式, 共同进步. Scene for Observer Pattern 举个例子说明在什么情况下会使用观察者模式,比如说一个网站,有订阅的功能,读者在提交订阅申请的时候会写入自己的邮件地址.那么每当这个网站有新内容更

设计模式--观察者模式Observer(对象行为型)

一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. 二.UML类图 三.示例 //观察者 class Observer { public: Observer() {} virtual ~Observer() {} virtual void Update() {} }; //博客 class Blog { public: Blog() {} virt

设计模式之“Observer”注疏#01

原文首发于我的微信公众号:GeekArtT. Observer设计模式是为了解决"信息同步更新"的问题而存在的.它试图解决这样一个问题:如果有"一堆对象"都跟随"某一对象"的变化而变化,那么,如何能够保持"这堆对象"能够同步更新呢?特别是,"这堆对象"很可能在运行时(run-time)不断被添加或者被删除,你设计的机制该如何既能保持增添/删除的灵活性,而又能使"当前这堆对象"同步更新呢?

设计模式(19)--Observer(观察者模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 2.模式特点: 观察者模式

设计模式:Observer(观察者)—— Guava EventBus

本文分为三个部分: Observer(观察者) Guava EventBus详解 Guava EventBus使用示例 1. Observer(观察者) 1.1 背景 我们设计系统时,常常会将系统分割为一系列相互协作的类,使得这些类之间可以各自独立地复用,系统整体结构也会比较清晰.这是一种最基本的面向对象的设计方式,大多数情况下也非常有效.但是,如果这些相互协作的类之间的“协作”关系比较复杂,那么就会有副作用:需要维护这些类对象间的状态一致性. 我们以一个数据可视化系统为例来说明: (1)数据可

设计模式之observer and visitor

很长时间一直对observer(观察者)与visitor(访问者)有些分不清晰. 今天有时间进行一下梳理: 1.observer模式 这基本就是一个通知模式,当被观察者发生改变时,通知所有监听此变化的观察者. MVC.消息队列等等设计有此思想. 在被观察者中,都会存储一个及以上的的观察者名单(映射) 2.visitor模式 访问者模式,主要的解决问题是,通过多态的方式解决,不同的被访问者将会体现不同的形态. 当然这个时候不同于observer模式的观察者名单,而是用不同的接口(接口参数是观察者实