Java设计模式之观察者模式原理与用法详解

本文实例讲述了Java设计模式之观察者模式原理与用法。分享给大家供大家参考,具体如下:

什么是观察者模式

可以这么理解:

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

也可以这样理解:

观察者模式是关于多个对象想知道一个对象中数据变化情况的一种成熟模式。观察者模式中有一个称作“主题”的对象和若干个称作“观察者”的对象,“主题”和“观察者”之间是一种一对多的依赖关系。

当“主题”的状态发生变化时,所有“观察者”都得到通知。

日常生活中,最容易理解的例子就是微信公众号。我们用微信订阅的微信公共号就是这里所说的主题,而我们 每一个关注这个微信号的人就是这里的观察者。公众号每天有更新,所有订阅者都会收到。

观察者模式类图:

抽象主题角色: 把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。

具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

代码实现观察者模式

抽象主题角色

主题接口规定了具体主题需要实现的添加,删除及通知观察者更新数据的方法

/**

* 抽象主题,被观察者

*

*/

public interface Subject {

/**

* 添加观察者

*

* @param observer

*/

void addObserver(Observer observer);

/**

* 移除指定的观察者

*

* @param observer

*/

void removeObserver(Observer observer);

/**

* 移除所有的观察者

*/

void removeAll();

/**

* data 是要通知给观察者的数据 因为Object是所有类的父类,可以使用多态,当然 你也可以使用 泛型

*

* @param data

*/

void notifyAllObserver(Object data);

/**

* 单独 通知某一个观察者

*

* @param observer

* @param data

* data 是要通知给观察者的数据 因为Object是所有类的父类,可以使用多态,当然 你也可以使用 泛型

*/

void notify(Observer observer, Object data);

}

抽象观察者角色

观察者接口规定了具体观察者用来更新数据的方法

/**

* 抽象观察者接口

*/

public interface Observer {

/**

*

* @param subject 被观察者

* @param data 被观察者传递给观察者的 数据

*/

void update(Subject subject,Object data);

}

具体主题角色

public class ConcreteSubject implements Subject {

//观察者集合,用于管理所有的观察者

List mList = new ArrayList<>();

@Override

public void addObserver(Observer observer) {

// TODO Auto-generated method stub

// 确保相同的观察者只含有一个

if (observer == null) {

throw new NullPointerException("observer == null");

}

if (!mList.contains(observer)) {

mList.add(observer);

}

}

@Override

public void removeObserver(Observer observer) {

// TODO Auto-generated method stub

mList.remove(observer);

}

@Override

public void removeAll() {

// TODO Auto-generated method stub

mList.clear();

}

@Override

public void notifyAllObserver(Object data) {

// TODO Auto-generated method stub

for (Observer observer : mList) {

observer.update(this, data);

}

}

@Override

public void notify(Observer observer, Object data) {

// TODO Auto-generated method stub

if (observer != null) {

observer.update(this, data);

}

}

}

具体的观察者角色

这里我们可以定义多个具体的观察者角色

观察者One

public class ObserverOne implements Observer {

@Override

public void update(Subject subject, Object data) {

// TODO Auto-generated method stub

System.err

.println("the messge from subject to-->" + this.getClass().getName() + "

}

}

观察者Two

public class ObserverTwo implements Observer {

@Override

public void update(Subject subject, Object data) {

// TODO Auto-generated method stub

System.err

.println("the messge from subject to-->" + this.getClass().getName() + "

}

}

观察者Three

public class ObserverThree implements Observer {

@Override

public void update(Subject subject, Object data) {

// TODO Auto-generated method stub

System.err

.println("the messge from subject to-->" + this.getClass().getName() + "

}

}

测试类

public class TestObservePattern {

public static void main(String[] args) {

// TODO Auto-generated method stub

ConcreteSubject concreteSubject = new ConcreteSubject();

ObserverOne observerOne=new ObserverOne();

ObserverTwo observerTwo=new ObserverTwo();

ObserverThree observerThree=new ObserverThree();

concreteSubject.addObserver(observerOne);

concreteSubject.addObserver(observerTwo);

concreteSubject.addObserver(observerThree);

//通知所有的观察者

concreteSubject.notifyAllObserver("wake up,wake up");

//通知某个特定的观察者OberverTwo

concreteSubject.notify(observerTwo, "Specila msg for you");

//观察者ObserveThree 决定不再订阅主题

concreteSubject.removeObserver(observerThree);

//通知所有的观察者

concreteSubject.notifyAllObserver("new Message come ");

}

}

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

Java设计模式之观察者模式原理与用法详解相关教程

java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解相关推荐

  1. java 字节缓冲_Java字节缓冲流原理与用法详解

    本文实例讲述了Java字节缓冲流原理与用法.分享给大家供大家参考,具体如下: 一 介绍 BufferInputStresm和BufferOutputStream 这两个流类为IO提供了带缓冲区的操作, ...

  2. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  3. java 生成dump_java dump文件怎么生成和分析-JMAP用法详解

    jmap是java自带的工具 1. 查看整个JVM内存状态 jmap -heap [pid] 2. 查看JVM堆中对象详细占用情况 jmap -histo [pid] 3. 导出整个JVM 中内存信息 ...

  4. python适配器模式角色_Python设计模式之适配器模式原理与用法详解

    本文实例讲述了Python设计模式之适配器模式原理与用法.分享给大家供大家参考,具体如下: 适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口. 下面是一个适配 ...

  5. java.exe 安装程序_java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写Java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写Java代码,将编写好的Java项目导出一个.jar格 ...

  6. java list 重复数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个List集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  7. java 匿名内部类 参数_Java匿名内部类原理与用法详解

    本文实例讲述了Java匿名内部类原理与用法.分享给大家供大家参考,具体如下: 一 点睛 匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下: new 父类构造器(实参列表) | 实 ...

  8. java生成字符串数组_Java 生成随机字符串数组的实例详解

    Java 生成随机字符串数组的实例详解 利用Collections.sort()方法对泛型为String的List 进行排序.具体要求: 1.创建完List之后,往其中添加十条随机字符串 2.每条字符 ...

  9. java 中适配器原理_Java经典设计模式中关于适配器模式原理以及用法详解

    这篇文章主要介绍了Java经典设计模式之适配器模式,简单说明了适配器模式的概念.原理,并结合实例形式分析了java适配器模式的用法与相关注意事项,需要的朋友可以参考下 本文实例讲述了Java经典设计模 ...

最新文章

  1. 【经典面试题一】最长公共子序列(经典动态规划题)
  2. mysql卸载后root还在_CentoOs7 Mysql卸载后重新安装缺少/root/.mysql_secret
  3. [深度学习-实践]tensorflow_hub简单理解模型的生成与加载
  4. C中的运算符优先级和结合性 *p++
  5. JSK-337 汽水瓶【数学+模拟】
  6. python爬虫案例——糗事百科数据采集
  7. RHEL5中实现各种服务的准备条件:
  8. 由于Web服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面(http error 404.2、iis、0x800704ec)...
  9. 龙芯录取通知书引争议 中科院回复:龙芯不是汉芯
  10. C++对ascii文件按行和分隔符读取并显示
  11. 您可能不了解JS:JavaScript圣经的见解
  12. 一文了解知识图谱能做什么、本文含Jiagu自然语言处理工具试用、知识图谱实战。
  13. Ciphertext-Policy Attribute-Based Encryption (CP-ABE) Toolkit Installation
  14. python设置端口控制ie浏览器_[Python爬虫] 之二:Selenium 调用IEDriverServer打开IE浏览器安装配置...
  15. 01、本地微信服务器测试环境
  16. 分布式系统论文精读2:GFS
  17. 利用傅里叶变换获取低频和高频部分图像
  18. 免费python编程自学网站-可以免费自学编程的12个网站
  19. Rocksdb Compaction 源码详解(一):SST文件详细格式源码解析
  20. 伸手摘星,未必如愿,但不会弄脏你的手……

热门文章

  1. 通过窗口名字(caption的内容)查找窗口,并将其隐藏或者置顶显示
  2. VS系列IDE(2005、2008等)下使用cppunit的方法及使用示例
  3. ios 发送请求时按home_iPhone 是否能够升级至指定的 iOS 系统版本?
  4. python把hdf转为tif_命令行记录-python读取hdf图层,转成tif文件
  5. Laravel 使用 scout 集成 elasticsearch 做全文搜索
  6. SCCM安装所需组件图
  7. ssh 免密码登录远程主机 免登录运行指令
  8. 微软服务器虚拟化-Hyper-v详解
  9. gcn语义分割_语义分割该如何走下去?
  10. jquery数组怎么传给后台_我是如何让公司后台管理系统焕然一新的(下)封装组件...