Java观察者模式(Observer)
一、定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。主要应用在java的AWT事件机制。
二、角色
- 抽象主题角色(Subject):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
- 具体主题角色(RealSubject):在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
- 抽象观察者角色(Observer):为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
- 具体观察者角色(RealObserver):该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用,通常用一个子类实现。
三、代码演示
抽象观察者角色(Observer)
/**
* 抽象观察者角色
* @author zhangkang
*
*/
public interface MyObserver {
void update(String message,String subjectName);
}
具体观察者角色1(RealObserver1)
/**
* 具体观察者1
* @author zhangkang
*
*/
public class RealObserver1 implements MyObserver{
private String name;
public RealObserver1(String name) {
this.name = name;
}
@Override
public void update(String message, String subjectName) {
System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
}
}
具体观察者角色2(RealObserver2)
/**
* 具体观察者2
* @author zhangkang
*
*/
public class RealObserver2 implements MyObserver{
private String name;
public RealObserver2(String name) {
this.name = name;
}
@Override
public void update(String message, String subjectName) {
System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
}
}
抽象主题角色(Subject)
/**
* 抽象主题角色
* @author zhangkang
*
*/
public interface MySubject {
void addObserver(MyObserver o); //添加观察者
void deleteObserver(MyObserver o); //删除观察者
void notifyObservers(String message); //通知所有的观察者
}
具体主题角色(RealSubject)
import java.util.ArrayList;
import java.util.List;
/**
* 具体主题
* @author zhangkang
*
*/
public class RealSubject implements MySubject{
private String subjectName = "官方"; //主题名称
private List<MyObserver> list; //集合用来保存每个观察者
public RealSubject() {
list = new ArrayList<MyObserver>();
}
@Override
public void addObserver(MyObserver o) {
list.add(o);
}
@Override
public void deleteObserver(MyObserver o) {
list.remove(o);
}
@Override
public void notifyObservers(String message) {
for (MyObserver myObserver : list) {
myObserver.update(message, subjectName);
}
}
}
客户端测试
/**
* 客户端测试
* @author zhangkang
*
*/
public class Test {
public static void main(String[] args) {
//定义两个观察者
MyObserver o1 = new RealObserver1("段友1");
MyObserver o2 = new RealObserver2("段友2");
//定义一个主题
MySubject subject = new RealSubject();
//添加观察者
subject.addObserver(o1);
subject.addObserver(o2);
//发布消息通知观察者
subject.notifyObservers("内涵段子TV已下架!");
}
}
输出:
段友1:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】
段友2:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】
Java观察者模式(Observer)的更多相关文章
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- [Android&Java]浅谈设计模式-代码篇:观察者模式Observer
观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个 ...
- Java 设计模式系列(十五)观察者模式(Observer)
Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...
- 设计模式 - 观察者模式(Observer Pattern) Java内置 用法
观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...
- java: 观察者模式:Observable被观察者,Observer观察者
java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...
- 《JAVA设计模式》之观察者模式(Observer)
在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Mo ...
- Java观察者模式(Observer模式)
Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...
- java观察者模式
像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...
- C# ~ 从 委托事件 到 观察者模式 - Observer
委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...
随机推荐
- abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一)
在前面我已经介绍了ASP.NET MVC.ASP.NET Razor.WEBAPI等技术.我准备通过一个实践项目来整体应用一下之前介绍的技术.本系列是介绍基于ABP+EasyUI的Web开发框架的形成 ...
- windows 用VMware创建linux虚拟机,安装操作系统CentOS7.2
1.按照向导创建虚拟机 以下是安装虚拟机的步骤,没有写的直接下一步 [1]主页-创建新虚拟机 [2]选择 自定义(高级) [3]选择稍后安装操作系统 [4]给虚拟机命名并指定所在位置 [5]给处理器配 ...
- H5gulp版非前后的分离环境
由于公司不同意我们使用前后端分离进行开发,硬是要我们和PHP混合在一起,所以用gulp搭建了一个简单的手脚架来用 目录结构: 主要是gulpfile.js里的内容 var gulp = require ...
- AnyCAD OpenSource 版本下载和编译
下载: SVN下载地址:https://anycad.svn.codeplex.com/svn 或者直接下载:http://anycad.codeplex.com/SourceControl/late ...
- git从无到有建立一个仓库并上传文件
第一步,创建仓库 登录自己的码云 第二步,本地操作 1.到你所要上传的文件夹中右键 选择git bash here 2.初始化项目 git init 3.连接远程仓库 刚才我们建立的时候的远程地址就 ...
- bootstrap fileinput 上传文件
最近用到文件上传功能, 说实话:以前遇到过一次,COPY了别人的代码 结束! 这次又要用,可是看到别人很酷的文件上传功能,心痒了! 好吧.简单的办法,找控件: bootstrap fileinput ...
- PHP中调用SVN命令更新网站方法(解决文件名包含中文更新失败的问题)
想说写一个通过网页就可以执行 SVN 升级的程序,结果并不是我想得那样简单,有一些眉角需要注意的说. 先以 Apache 的用户帐号执行 SVN checkout,这样 Apache 才有 SVN 的 ...
- ORACLE中能否找到未提交事务的SQL语句
在Oracle数据库中,我们能否找到未提交事务(uncommit transactin)的SQL语句或其他相关信息呢? 关于这个问题,我们先来看看实验测试吧.实践出真知. 首先,我们在会话1(S ...
- github的pull Request使用
场景: teamA要一起做一个项目,选择用github管理自己的代码仓库,这时userA在github上新建了一个远程仓库,其他人需要通过pull request来实现提交.那么,问题来了,pull ...
- 使用notepad++远程编辑Linux文档
上一篇中,我写了如何使用使用ftp服务器实现很方便的通信,这一篇我分享一个使用notepad++的一个NPPFTP插件远程编辑Linux中的文档的小技巧. 首先要确保你的Linux的ftp服务已经打开 ...