全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java编程之内置观察者模式实例详解

本文实例讲述了Java内置观察者模式。分享给大家供大家参考,具体如下:

之前也简单地写过观察者模式(又称为发布-订阅模式)小例子,现在项目中也常用到该模式。今天贴一下如何使用Java内置的观察者模式。

主要使用到的Java API就两个类:

Observer接口:观察者对象,监听被观察者对象数据变化,一是数据发生变化 ,就做出相应地啥响应。
Observable类:被观察者对象,提供添加及移出观察者对像方法,数据发生哟完成时并通知所有已经添加进来的观察者对象。

被观察者代码示例:

//Observable是被观察者对象接口,实现该接口就是:目标(被观察者)的具体实现
public class TargetObservable extends Observable {
 // 要观察的数据:消息发生改变时,所有被添加的观察者都能收到通知
 private String message;
 public String getConent() {
  return message;
 }
 public void setMessage(String message) {
  this.message = message;
  // 被观察者数据发生变化时,通过以下两行代码通知所有的观察者
  this.setChanged();
  this.notifyObservers(message);
 }
}

2个观察者代码示例:

//Observer对象是观察者,实现Observer的对象就是具体的观察者对象
public class TargetObserver implements Observer {
 // 定义观察者名称
 private String name;
 public String getObserverName() {
  return name;
 }
 public void setObserverName(String observerName) {
  this.name = observerName;
 }
 @Override
 public void update(Observable arg0, Object arg1) {
  //更新消息数据
  System.out.println(name + "收到了发生变化的数据内容是:"
    + ((TargetObservable) arg0).getConent());
 }
}

public class TargetObserver01 implements Observer {
 // 定义观察者名称
 private String name01;
 public String getObserverName() {
  return name01;
 }
 public void setObserverName(String observerName) {
  this.name01 = observerName;
 }
 @Override
 public void update(Observable arg0, Object arg1) {
  //更新消息数据
  System.out.println(name01 + "收到了发生变化的数据内容是:"
    + ((TargetObservable) arg0).getConent());
 }
}

测试代码:

/**
  * @description:测试类
  * @author ldm
  * @date 2016-11-1 上午8:29:07
  */
 public static void main(String[] args) {
  // 创建一个具体的被 观察者
  TargetObservable observable = new TargetObservable();
  // 创建第一个观察者
  TargetObserver one = new TargetObserver();
  one.setObserverName("我是观察者A");
  // 创建第二个观察者
  TargetObserver01 two = new TargetObserver01();
  two.setObserverName("我是观察者B");
  // 注册观察者
  observable.addObserver(one);
  observable.addObserver(two);
  // 目标更新天气情况
  observable.setMessage("***我要更新的数据***");
 }
}

执行结果:

我是观察者B收到了发生变化的数据内容是:—–我要更新的数据—–
我是观察者A收到了发生变化的数据内容是:—–我要更新的数据—–

模式优点:

一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息通知给所有已经添加观察者。基于接口实现为程序提供了更大的灵活性。

但在使用时要注意根据条件及时添加或移除观察者对象,否则可能导致意料外结果 。

最后附上Observer和Observable的原码,这样我们自己在写的时候就知道如何下手了:

package java.util;
import java.util.Observable;
public interface Observer {
 void update(Observable var1, Object var2);
}

package java.util;
import java.util.Observer;
import java.util.Vector;
public class Observable {
 private boolean changed = false;
 private Vector<Observer> obs = new Vector();
 public Observable() {
 }
 public synchronized void addObserver(Observer var1) {
  if(var1 == null) {
   throw new NullPointerException();
  } else {
   if(!this.obs.contains(var1)) {
    this.obs.addElement(var1);
   }
  }
 }
 public synchronized void deleteObserver(Observer var1) {
  this.obs.removeElement(var1);
 }
 public void notifyObservers() {
  this.notifyObservers((Object)null);
 }
 public void notifyObservers(Object var1) {
  Object[] var2;
  synchronized(this) {
   if(!this.changed) {
    return;
   }
   var2 = this.obs.toArray();
   this.clearChanged();
  }
  for(int var3 = var2.length - 1; var3 >= 0; --var3) {
   ((Observer)var2[var3]).update(this, var1);
  }
 }
 public synchronized void deleteObservers() {
  this.obs.removeAllElements();
 }
 protected synchronized void setChanged() {
  this.changed = true;
 }
 protected synchronized void clearChanged() {
  this.changed = false;
 }
 public synchronized boolean hasChanged() {
  return this.changed;
 }
 public synchronized int countObservers() {
  return this.obs.size();
 }
}

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

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


# Java  # 内置  # 观察者模式  # Java回调函数实例代码详解  # Java通过匿名类来实现回调函数实例总结  # 基于Java 谈回调函数  # Java 回调函数详解及使用  # Java经典设计模式之观察者模式原理与用法详解  # java 在观察者模式中使用泛型T的实例  # java设计模式之观察者模式学习  # Java回调函数与观察者模式实例代码  # 我是  # 我要  # 收到了  # 操作技巧  # 相关内容  # 第一个  # 多个  # 都能  # 一是  # 更大  # 但在  # 感兴趣  # 数据结构  # 第二个  # 给大家  # 中也  # 时要  # 所述  # 如何使用  # 创建一个 


相关文章: 广州营销型建站服务商推荐:技术优势与SEO优化解析  大学网站设计制作软件有哪些,如何将网站制作成自己app?  香港服务器租用费用高吗?如何避免常见误区?  建站之星后台密码遗忘?如何快速找回?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  建站之星客服服务时间及联系方式如何?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Android自定义listview布局实现上拉加载下拉刷新功能  北京网站制作网页,网站升级改版需要多久?  如何在西部数码注册域名并快速搭建网站?  Python文件管理规范_工程实践说明【指导】  Swift中循环语句中的转移语句 break 和 continue  如何正确选择百度移动适配建站域名?  如何高效配置IIS服务器搭建网站?  建站之星代理费用多少?最新价格详情介绍  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  如何零基础在云服务器搭建WordPress站点?  如何高效配置香港服务器实现快速建站?  建站主机SSH密钥生成步骤及常见问题解答?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速搭建安全的FTP站点?  如何在阿里云虚拟服务器快速搭建网站?  建站之星微信建站一键生成小程序+多端营销系统  如何用y主机助手快速搭建网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何确认建站备案号应放置的具体位置?  如何配置IIS站点权限与局域网访问?  详解jQuery中基本的动画方法  网站插件制作软件免费下载,网页视频怎么下到本地插件?  香港服务器WordPress建站指南:SEO优化与高效部署策略  建站主机核心功能解析:服务器选择与网站搭建流程指南  已有域名和空间如何搭建网站?  如何快速查询网站的真实建站时间?  内网网站制作软件,内网的网站如何发布到外网?  建站之星与建站宝盒如何选择最佳方案?  建站之星后台密码遗忘或太弱?如何重置与强化?  如何选择高效可靠的多用户建站源码资源?  上海网站制作开发公司,上海买房比较好的网站有哪些?  建站与域名管理如何高效结合?  教程网站设计制作软件,怎么创建自己的一个网站?  建站VPS推荐:2025年高性能服务器配置指南  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  Swift中swift中的switch 语句  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。