当前位置:首页 > 编程教程 > java技术文章 > Java学习笔记之观察者模式

Java 观察者模式学习

  • 发布时间:
  • 作者:码农之家
  • 点击:125

这篇文章主要知识点是关于java、观察者模式、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Java JDK 8学习笔记
Java JDK 8学习笔记全书扫描版
  • 类型:Java大小:92.3 MB格式:PDF作者:林信良
立即下载

Java学习笔记之观察者模式

本文为大家分享了Java设计模式之观察者模式,供大家参考,具体内容如下

1、初步认识

观察者模式的定义:

  在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。

大白话:

  其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

2、这个模式的结构图

Java学习笔记之观察者模式

3、可以看到,该模式包含四个角色

抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

4、使用场景例子

  有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息。

5、观察者模式具体实现

1)、定义一个抽象被观察者接口

package com.jstao.observer;

/***
 * 抽象被观察者接口
 * 声明了添加、删除、通知观察者方法
 * @author jstao
 *
 */
public interface Observerable {
  
  public void registerObserver(Observer o);
  public void removeObserver(Observer o);
  public void notifyObserver();
  
}

2)、定义一个抽象观察者接口

package com.jstao.observer;

/***
 * 抽象观察者
 * 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
 * @author jstao
 *
 */
public interface Observer {
  public void update(String message);
}

3)、定义被观察者,实现了Observerable接口,对Observerable接口的三个方法进行了具体实现,同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可。

 

package com.jstao.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 被观察者,也就是微信公众号服务
 * 实现了Observerable接口,对Observerable接口的三个方法进行了具体实现
 * @author jstao
 *
 */
public class WechatServer implements Observerable {
  
  //注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程
  private List<Observer> list;
  private String message;
  
  public WechatServer() {
    list = new ArrayList<Observer>();
  }
  
  @Override
  public void registerObserver(Observer o) {
    
    list.add(o);
  }
  
  @Override
  public void removeObserver(Observer o) {
    if(!list.isEmpty())
      list.remove(o);
  }

  //遍历
  @Override
  public void notifyObserver() {
    for(int i = 0; i < list.size(); i++) {
      Observer oserver = list.get(i);
      oserver.update(message);
    }
  }
  
  public void setInfomation(String s) {
    this.message = s;
    System.out.println("微信服务更新消息: " + s);
    //消息更新,通知所有观察者
    notifyObserver();
  }

}

4)、定义具体观察者,微信公众号的具体观察者为用户User

package com.jstao.observer;

/**
 * 观察者
 * 实现了update方法
 * @author jstao
 *
 */
public class User implements Observer {

  private String name;
  private String message;
  
  public User(String name) {
    this.name = name;
  }
  
  @Override
  public void update(String message) {
    this.message = message;
    read();
  }
  
  public void read() {
    System.out.println(name + " 收到推送消息: " + message);
  }
  
}

5)、编写一个测试类

首先注册了三个用户,ZhangSan、LiSi、WangWu。公众号发布了一条消息"PHP是世界上最好用的语言!",三个用户都收到了消息。

用户ZhangSan看到消息后颇为震惊,果断取消订阅,这时公众号又推送了一条消息,此时用户ZhangSan已经收不到消息,其他用户

还是正常能收到推送消息。

package com.jstao.observer;

public class Test {
  
  public static void main(String[] args) {
    WechatServer server = new WechatServer();
    
    Observer userZhang = new User("ZhangSan");
    Observer userLi = new User("LiSi");
    Observer userWang = new User("WangWu");
    
    server.registerObserver(userZhang);
    server.registerObserver(userLi);
    server.registerObserver(userWang);
    server.setInfomation("PHP是世界上最好用的语言!");
    
    System.out.println("----------------------------------------------");
    server.removeObserver(userZhang);
    server.setInfomation("JAVA是世界上最好用的语言!");
    
  }
}

测试结果:

Java学习笔记之观察者模式

6、小结

这个模式是松偶合的。改变主题或观察者中的一方,另一方不会受到影像。
JDK中也有自带的观察者模式。但是被观察者是一个类而不是接口,限制了它的复用能力。
在JavaBean和Swing中也可以看到观察者模式的影子。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

Java 相关电子书
学习笔记
网友NO.819800

JavaScript原生实现观察者模式的示例

观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。 它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。 在Nodejs中通过EventEmitter实现了原生的对于这一模式的支持。 在JavaScript中事件监听机制就可以理解为一种观察者模式。通过onclick进行事件绑定,然后通过交互行为进行触发或者事件主动触发。 下面给出一个JS自定义的PubSub,仔细阅读下面这段代码有助于你理解观察者模式。 一、定义观察者类Pubsub /* Pubsub */ function Pubsub(){ //存放事件和对应的处理方法 this.handles = {}; } 二、实现事件订阅on /……

网友NO.807294

Java设计模式之观察者模式_动力节点Java学院整理

定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 类型:行为类模式 类图: 在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。比如,我们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单;再比如,我们要设计一个自动部署的功能,就像eclipse开发时,只要修改了文件,eclipse就会自动将修改的文件部署到服务器中。这两个功能有一个相似的地方,那就是一个对象要时刻监听着另一个对象,只要它的状态一发生改变,自己随之要做出相应的行动。其实,能够实现这一点的方案很多,但是,无疑使用观察者模式是一个主流的选择。 观察者模式的结构 在最基础的观察者模式中,包……

网友NO.661116

Java回调函数与观察者模式实例代码

本文研究的主要是Java回调函数与观察者模式的实现,具体介绍和实现代码如下。 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。 在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 什么时候使用观察者模式: 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象……

网友NO.599193

java使用观察者模式异步短信/邮箱提醒用户群

需求 用户中有人设置了账户余额达到阈值时,短信/邮箱进行提醒的服务。我们将需要在他账户余额阈值达到指定数值的时候进行短信/邮箱消息通知,允许账户余额阈值出现偏差的时候通知,如果某个用户48小时内已经短信/邮箱进行过通知了,那么将不再进行通知。 剖析 存在两个主题:短信通知和邮箱通知 存在两种观察者:设置了短信通知且账户余额到达阈值的用户,设置了邮箱通知且账户余额到达阈值的用户。 用spring的定时器,每10分钟去数据库获取某个主题已经达到阈值且开始了该主题的提醒功能的用户 用spring的@Asycn注解异步短信通知,邮箱通知的相关方法 用redis设置用户短信/邮箱为键名,设置过期时间为48小时。如果获取不到该键值对,说明其在观察者行列 代码 观察者父类 /** * 订阅观察者 * @author Administrator * */@Component//标志为多例@Scope(……

网友NO.137269

深入理解Javascript中的观察者模式

简介 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。讲道理,如果我们写的不是稍微底层的代码,可能不会用到它。 但是有了它会让代码更灵活,更加规整,减少冗余代码,方便分模块,分功能开发。 使用观察者模式的好处: 支持简单的广播通信,自动通知所有已经订阅过的对象。 页面载入后目标对象很容易与观察者存在一种动态关联,增加了灵活性。 目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。 引入 在前端业务中,可能用的比较多的地方可能就是自定义事件了。 其实浏览器的事件也是观察者模式 div.onclick = function click() { console.log('click')} 这里function click 订阅了……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com