文档章节

设计模式之观察者模式(Observable与Observer)

ForingY
 ForingY
发布于 2016/02/28 14:01
字数 883
阅读 59
收藏 6
点赞 1
评论 2

好久没有写博客啦,之前看完了《设计模式之禅》也没有总结一下,现在回忆一下设计模式之观察者模式。

1.什么是观察者模式

  简单情形:有A、B、C、D等四个独立的对象,其中B、C、D这三个对象想在A对象发生改变的第一时间知道这种改变,以便做出相应的响应或者对策。

  上面的这种情形,就是观察者模式。

  当然可以有多个观察者多个被观察者

  观察者与被观察者也不是对立的,一个对象可以观察其他对象,也可以被其他对象观察。

2.观察者模式的应用

  为了更好的理解什么是观察者模式,下面我举一些可能用到该模式的情形或例子:

  (1)周期性任务。比如linux中的周期性任务命令crontab命令,win7下的定时关机命令shutdown -s -t 1200(1200s后关机)。这些命令当预期系统时间到后,就可以通知相应的观察者激活相应的命令。

  (2)重新加载配置文件。现在做大型系统基本都会有配置文件,例如在SSH项目中每次修改配置文件后,都需要重新启动服务器才能使得新的配置文件生效(当然SSH中貌似已经提供了参数设置,当配置文件修改时,可以自动重新加载)。

3.观察者模式需要用到的Java类

  3.1 java.util.Observable

    -able一般可能...的单词后缀,Observable就是可以被观察的,程序中的被观察者类,需要继承这个类。

  3.2 java.util.Observer

    这个是观察者,是接口。程序中的观察者类,需要实现这个接口中的update()方法。

4.程序实例+注释说明

  4.1 身份单一的观察者(被观察者)

  4.1.1被观察者类

import java.util.Observable;
 //被观察者类
public class NumObservable extends Observable {
    int data = 0;
 
    public void setData(int i) {
       data = i;
       setChanged();    //标记此 Observable对象为已改变的对象
       notifyObservers();    //通知所有观察者
    }
}

 4.1.2观察者类

import java.util.Observable;
import java.util.Observer;
 //观察者类
public class NumObserver implements Observer{
    
    public void update(Observable o, Object arg) {    //有被观察者发生变化,自动调用对应观察者的update方法
       NumObservable myObserable=(NumObservable) o;     //获取被观察者对象
       System.out.println("Data has changed to " +myObserable.data);
    }
}

 4.1.3 Test测试类

public class Test {
    public static void main(String[] args) {
       NumObservable number = new NumObservable();    //被观察者对象
       number.addObserver(new NumObserver());    //给number这个被观察者添加观察者(当然可以有多个观察者)
       number.setData(1);
       number.setData(2);
       number.setData(3);
    }
}

 测试输出:

  

  4.2 既是观察者又是被观察者

   4.2.1 MultA类

import java.util.Observable;
import java.util.Observer;

public class MultA extends Observable implements Observer{
    public void update(Observable o, Object arg) {    //有被观察者发生变化,自动调用相应观察者的update方法
       MultB multb=(MultB) o;     //获取被观察者对象
       System.out.println("MultA监听到MultB数据变化:" +multb.data);
       
       setChanged();    
       notifyObservers();    //自己观察到数据变化,通知自己的观察者
    }
}

 4.2.2 MultB类

import java.util.Observable;
import java.util.Observer;    
public class MultB extends Observable implements Observer {
    int data = 0;
 
    public void setData(int i) {
       data = i;
       setChanged();    //标记此 Observable对象为已改变的对象
       notifyObservers();    //通知所有观察者
    }

    public void update(Observable arg0, Object arg1) {
        System.out.println("MultB观察到几乎同时MultA也有数据变化,貌似自己的变化被监听。。。。");
    }
}

 4.2.3 Test测试类

public class Test {
    public static void main(String[] args) {
       MultA multa = new MultA();    
       MultB multb = new MultB();
       
       multb.addObserver(multa);
       multa.addObserver(multb);
       
       multb.setData(1);
    }
}

 输出结果:

    


© 著作权归作者所有

共有 人打赏支持
ForingY
粉丝 23
博文 272
码字总数 156129
作品 0
杭州
程序员
加载中

评论(2)

dfttw
dfttw
31
dfttw
dfttw
34
设计模式17——Observer设计模式

Observer观察者设计模式用于将对象的变化通知给感兴趣的用户。在Observer模式中的角色为主题(subject)与观察者(observer),观察者订阅它感兴趣的主题,一个主题可以被多个观 察者订阅,当...

小米米儿小
2014/01/26
0
0
设计模式(Swift) - 3.观察者模式、建造者模式

上一篇 设计模式(Swift) - 2.单例模式、备忘录模式和策略模式中讲了三种常见的设计模式. 单例模式: 限制了类的实例化,一个类只能实例化一个对象,所有对单例对象的引用都是指向了同一个对象....

Dariel
07/01
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0
设计模式:观察者模式 源码分析和在 RecyclerView 中的体现

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 写在前面 最近在学习 EventBus 和 RxJava 相关知识,了解到两者都使用了观察者模式。以前对该模式只有一个模糊的概念,导致看 E 和...

Marker_Sky
04/02
0
0
设计模式之「观察者模式」(Observer)

简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象...

柳哥
2014/12/16
0
0
观察者模式 vs 发布-订阅模式

我曾经在面试中被问道,“观察者模式和发布订阅模式的有什么区别?” 我迅速回忆起“Head First设计模式”那本书: 发布 + 订阅 = 观察者模式 “我知道了,我知道了,别想骗我” 我微笑着回答...

缪宇
06/29
0
0
Head first设计模式(2)

认识观察者模式 我们看看报纸和杂志的订阅是怎么回事: 1、报社的业务就是出版报纸 2、向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸...

祥林会跟你远走高飞
2014/12/26
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0
Tomcat 系统架构与设计模式_ 设计模式分析

门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到...

lvzjane
2014/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zk实战--rpc框架集群化

在看此篇内容时需要浏览下面内容 netty实战--手写rpc框架 前文功能简介以及功能扩充 利用netty来实现一个点对点的rpc调用。客户端和服务端都是靠手写地址进行socket同学的,无法1对多,也无法...

xpbob
13分钟前
7
0
springboot 发送邮件

获取授权码 添加配置 # 账号和密码spring.mail.username=aaa@qq.comspring.mail.password=bbb# 服务器地址spring.mail.host=smtp.qq.comspring.mail.properties.mail.smtp.ssl.en...

阿豪boy
13分钟前
0
0
如何使用GNU Ring?

文章名:如何使用GNU Ring? 作者:冰焰火灵X 1079092922@qq.com 文章许可:CC BY-SA 4.0 ##1. 安装 下载GNU Ring 点击左边选择你的系统版本(这里以 GNU/Linux 为例,我使用的是Mint 18.3)...

ICE冰焰火灵X
16分钟前
1
0
深入理解springMVC

什么是spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而...

Java填坑之路
21分钟前
1
0
《射雕英雄传》书摘

1. 我虽是个飘泊江湖的贫家女子,可不是低三下四、不知自爱之人。你如真心爱我,须当敬我重我。我此生决无别念,就是钢刀架颈,也决意跟定了你。将来……将来如有洞房花烛之日,自然……自能...

k91191
32分钟前
0
0
解决:modal中datePicker 选中时,会触发modal的hidden.bs.modal事件

最近项目中发现了一个bug,具体表现为选中模态框上datepicker组件上的日期时,会触发模态框的关闭事件,导致数据编辑无法正常进行。网上搜索了下,解决方法如下: $('.datepicker').on('hid...

Funcy1122
36分钟前
0
0
Redis分布式锁的正确实现方式

前言 分布式锁一般有三种实现方式: 1.数据库乐观锁 2.基于Redis的分布式锁; 3.基于Zookeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis...

大海201506
今天
0
0
ClassNotFoundException: javax.el.ELManager

这个是因为tomcat7中的el-api2.2,有些版本太低,建议升级tomcat到8.0,利用el-api3.0就会解决这个问题。

无语年华
今天
0
0
Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
今天
1
0
CentOS 7.4 设置系统字符编码

1.语言变量LANG在 /etc/locale 文件中。 2.可以通过/ect/profile 来修改LC_TYPE 变量的值 添加如下代码 export LC_ALL="zh_CN.GBK" export LANG="zh_CN.GBK" 到profile文件中,变量的可以修改...

qimh
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部