Java:应用Observer接口实践Observer模式

2024-05-14 06:18

本文主要是介绍Java:应用Observer接口实践Observer模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  Java 中通过 Observable 类和 Observer 接口实现了观察者模式。 Observer 对象是观察者, Observable 对象是被观察者。
1. 实现观察者模式
实现观察者模式非常简单,
[1]创建被观察者类,它继承自java.util.Observable类;
[2]创建观察者类,它实现java.util.Observer接口;
[3]对于被观察者类,
添加它的观察者:
void addObserver(Observer o)
addObserver()方法把观察者对象添加到观察者对象列表中。
当被观察事件发生时,执行:
setChanged();
notifyObservers();
setChange()方法用来设置一个内部标志位注明数据发生了变化;notifyObservers()方法会去调用观察者对象列表中所有的Observer的update()方法,通知它们数据发生了变化。
只有在setChange()被调用后,notifyObservers()才会去调用update()。
[4]对于观察者类,实现Observer接口的唯一方法update
void update(Observable o, Object arg)
形参Object arg,对应一个由notifyObservers(Object arg);传递来的参数,当执行的是notifyObservers();时,arg为null。
2.实例一
NumObserable是一个被观察者,当它的成员变量data的数值发生变化时,会通知所有的观察者。
NumObserable.java
package  com.zj.observer;
import  java.util.Observable;
public   class  NumObservable  extends  Observable {
     private   int   data  = 0;
     public   int  getData() {
        return   data ;
    }
     public   void  setData( int  i) {
        data  = i;
       setChanged();
       notifyObservers();
    }
}
NumObserver是观察者。当它的被观察者(NumObserable)执行了 notifyObservers()后,它会执行uodate()方法。
NumObserver.java
package  com.zj.observer;
import  java.util.Observable;
import  java.util.Observer;
public   class  NumObserver  implements  Observer{
     public   void  update(Observable o, Object arg) {
       NumObservable myObserable=(NumObservable) o;
       System. out .println( "Data has changed to " +myObserable.getData());
    }
}
测试类SingleTest,在这里将观察者加入到被观察者的观察列表中。
SingleTest.java
package  com.zj.observer;
public   class  SingleTest {
     public   static   void  main(String[] args) {
       NumObservable number =  new  NumObservable();
       number.addObserver( new  NumObserver());
       number.setData(1);
       number.setData(2);
       number.setData(3);
    }
}
结果:
Data has changed to 1
Data has changed to 2
Data has changed to 3
3.实例二
这个实例中,还是对data进行观察,拥有两个观察者,分别观察奇数和偶数的变化,通过notifyObservers(arg)中的参数arg来识别通知信息。
被观察者NumsObservable.java
package  com.zj.observers;
import  java.util.Observable;
public   class  NumsObservable  extends  Observable {
     public   final   static  Integer  ODD  = 1;
     public   final   static  Integer  EVEN  = 2;
     private   int   data  = 0;
     public   int  getData() {
        return   data ;
    }
     public   void  setData( int  i) {
        data  = i;
       Integer flag =  EVEN ;
        if  (( data  & 0x0001) == 1)
           flag =  ODD ;
       setChanged();
       notifyObservers(flag);
    }
}
奇数观察者OddObserver.java
package  com.zj.observers;
import  java.util.Observable;
import  java.util.Observer;
public   class  OddObserver  implements  Observer {
     public   void  update(Observable o, Object arg) {
        if  (arg == NumsObservable. ODD ) {
           NumsObservable myObserable = (NumsObservable) o;
           System. out .println( "OddObserver:Data has changed to "  + myObserable.getData());
       }
    }
}
偶数观察者EvenObserver.java
package  com.zj.observers;
import  java.util.Observable;
import  java.util.Observer;
public   class  EvenObserver  implements  Observer {
     public   void  update(Observable o, Object arg) {
        if  (arg == NumsObservable. EVEN ) {
           NumsObservable myObserable = (NumsObservable) o;
           System. out .println( "EvenObserver:Data has changed to "  + myObserable.getData());
       }
    }
}
测试类MultiTest.java
package  com.zj.observers;
public   class  MultiTest {
     public   static   void  main(String[] args) {
       NumsObservable number =  new  NumsObservable();
       number.addObserver( new  OddObserver());
       number.addObserver( new  EvenObserver());
       number.setData(1);
       number.setData(2);
       number.setData(3);
    }
}
结果:
OddObserver:Data has changed to 1
EvenObserver:Data has changed to 2
OddObserver:Data has changed to 3

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/68949

这篇关于Java:应用Observer接口实践Observer模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987974

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,