Java:应用Observer接口实践Observer模式
本文出自“子 孑” 博客,原文链接:http://zhangjunhd.blog.51cto.com/113473/68949
在Java中通过Observable类和Observer接口实现了观察者模式。Observer对象是观察者,Observable对象是被观察者。
void addObserver(Observer o)
setChanged();
notifyObservers();
只有在setChange()被调用后,notifyObservers()才会去调用update()。setChange()方法用来设置一个内部标志位注明数据发生了变化;notifyObservers()方法会去调用观察者对象列表中所有的Observer的update()方法,通知它们数据发生了变化。
void update(Observable o, Object arg)
2.实例一形参Object arg,对应一个由notifyObservers(Object arg);传递来的参数,当执行的是notifyObservers();时,arg为null。
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()方法。
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,在这里将观察者加入到被观察者的观察列表中。
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
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结果:
Java:应用Observer接口实践Observer模式的更多相关文章
- 应用Observer接口实践Observer模式
原文:http://zhangjunhd.blog.51cto.com/113473/68949/ 在Java中通过Observable类和Observer接口实现了观察者模式.Observer对象是 ...
- Java面向对象_接口应用——策略模式
概念:定义了一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化. 接口抽象的就是某种方法. OO设计原则:1.面向接口编程 2.封装变化 3.多用 ...
- Java中使用Observer接口和Observable类实践Observer观察者模式
在Java中通过Observable类和Observer接口实现了观察者模式.实现Observer接口的对象是观察者,继承Observable的对象是被观察者. 1. 实现观察者模式 实现观察者模式非 ...
- Java设计模式(17)——行为模式之观察者模式(Observer)
一.概述 概念 UML简图 我们根据一个示例得类图来分析角色 角色 抽象主题:保存观察者聚集(集合),管理(增删)观察者 抽象观察者:定义具体观察者的抽象接口,在得到主题通知后更新自己 具体主题:将有 ...
- Java常用类库--观察者设计模式( Observable类Observer接口)
如果要想实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口. import java.util.* ; class House extends Obse ...
- 利用Java提供的Observer接口和Observable类实现观察者模式
对于观察者模式,其实Java已经为我们提供了已有的接口和类.对于订阅者(Subscribe,观察者)Java为我们提供了一个接口,JDK源码如下: package java.util; public ...
- Java Observer接口和Observable类实现观察者模式
对于观察者模式,其实Java已经为我们提供了已有的接口和类.对于订阅者(Subscribe,观察者)Java为我们提供了一个接口,JDK源码如下: package java.util; public ...
- 《JAVA设计模式》之观察者模式(Observer)
在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Mo ...
- java中观察者模式Observable和Observer
25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的 ...
随机推荐
- docker国内镜像加速
在/etc/docker/daemon.json中添加内容: { "registry-mirrors": ["https://registry.docker-cn.c ...
- shell中得到当下路径所有文件夹名称
方法1: for dir in $(ls -al ./|awk '/^d/ {print $NF}') do echo $dir done 方法2: for dir in $(ls ./) d ...
- win7 配置 用户/系统DSN (解决plsql odbc导入器 DSN 没有选项)
(2013-05-07 15:07:29) 转载▼ 标签: it 老笔记本越来越卡,最近重新做了win7的系统 从sql server中导出的 excel文件 准备通过plsql倒入的oracle ...
- (二)Spring中的ioc
目录 Spring的ioc操作 ioc底层使用的技术 ioc底层原理 ioc入门案例 bean管理(xml方式) IOC和DI的区别 Spring整合WEB的原理 Spring 整合的具体操作 Spr ...
- 17.Letter Combinations of a Phone Number (char* 和 string 相互转化)
leetcode 第17题 分析 char*和string相互转化 char*(或者char)转string 可以看看string的构造函数 default (1) string(); copy (2 ...
- PAT题目AC汇总(待补全)
题目AC汇总 甲级AC PAT A1001 A+B Format (20 分) PAT A1002 A+B for Polynomials(25) PAT A1005 Spell It Right ( ...
- python基础(十三)--os和sys模块
os模块 os.getpwd():获取当前工作目录(windows下没有) os.listdir(path):列出目录下的文件 os.remove(path):删出文件 (不能是目录,即文件夹) os ...
- 待解决问题 jscore 与 node.js jsbridge
jscore 与 node.js jsbridge https://juejin.im/post/5b395eb96fb9a00e556123ef
- [Vue]子组件与父组件之间传值
1.父组件与子组件传值props 1.1定义父组件,父组件传递 inputText这个数值给子组件: //父组件 //引入的add-widget组件 //使用 v-bind 的缩写语法通常更简单: & ...
- Python实现字符的冒泡排序——说实话,两个数兑换的方法震惊了我,一天比一天感受到了Python的强大
import random M= lettList=[] for i in range(M): lettList.append(chr(random.randrange(,))) for lett i ...