如何实现简单的观察者模式
接下来我们实现壹個简单的被观察者类 ExampleObservable ,代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
import java.util.Observable;
public class ExampleObservable extends Observable {
int data = 0 ;
public void setData( int data){
this .data = data;
this .setChanged(); //标记此 Observable对象为已改变的对象
this .notifyObservers(); //通知所有的观察者
}
} |
再实现壹個观察者类 ExampleObserver,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
import java.util.Observable;
import java.util.Observer;
public class ExampleObserver implements Observer {
//有被观察者发生变化,自动调用对应观察者的update方法
@Override
public void update(Observable object, Object argument) {
//通过强制类型转换获取被观察者对象
ExampleObservable example = (ExampleObservable)object;
System.out.println( "example.data changed, the new value of data is " + example.data);
}
} |
我们再写壹個简单的测试类来测试下它是否运行正确,代码如下:
1
2
3
4
5
6
7
8
9
10
|
public class Main {
public static void main(String[] args) {
ExampleObservable example = new ExampleObservable();
example.addObserver( new ExampleObserver()); //给example这个被观察者添加观察者,允许添加多個观察者
example.setData( 2 );
example.setData(- 5 );
example.setData( 9999 );
}
} |
运行之后在控制台输出如下结果:
1
2
3
|
example.data changed, the new value of data is 2
example.data changed, the new value of data is - 5
example.data changed, the new value of data is 9999
|
通过输出结果我们可以了解到,当 ExampleObservable 类的实例 example 的成员变量 data 的值发生改变时,ExampleObserver 对象都能够监测到,然后调用 update() 方法打印壹句话到控制台,说明以上的结果是符合我们预期的。
既是观察者又是被观察者
对于壹個类而言,可以既是观察者又是被观察者,只要既继承 Observable 类,又实现 Observer 接口就可以了。接下来给出壹個类似的例子。例子中 ObserverA 和 ObserverB 既是观察者又是被观察者,它们互相监听着对方的改变。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
//ObserverA.java import java.util.Observable;
import java.util.Observer;
public class ObserverA extends Observable implements Observer {
@Override
public void update(Observable object, Object arg) {
ObserverB observerB = (ObserverB)object;
System.out.println( "observerB changed, the new value of observerB.data is " + observerB.data);
this .setChanged();
this .notifyObservers();
}
} //ObserverB.java import java.util.Observable;
import java.util.Observer;
public class ObserverB extends Observable implements Observer {
int data = 0 ;
@Override
public void update(Observable object, Object arg) {
System.out.println( "ObserverB found that ObserverA changed..." );
}
public void setData( int data){
this .data = data;
this .setChanged();
this .notifyObservers();
}
} //Main.java import net.oschina.bairrfhoinn.multiply.ObserverA;
import net.oschina.bairrfhoinn.multiply.ObserverB;
public class Main {
public static void main(String[] args) {
ObserverA a = new ObserverA();
ObserverB b = new ObserverB();
a.addObserver(b);
b.addObserver(a);
b.setData( 2 );
}
} |
运行之后的结果为:
1
2
|
observerB changed, the new value of observerB.data is 2
ObserverB found that ObserverA changed... |
之所以会出现上述运行结果,最初 ObserverA 和 ObserverB 相互之间作为观察者与被观察者,但是 ObserverB 的实例 b 先调用的 setData() 方法,然后 ObserverA 的实例 a 观察到了这個变化,于是调用了本类的 update 方法打印出了第壹行,紧接着 ObserverA 的 update() 方法在方法体中声明了自己发生了变化,于是 ObserverB 观察了这個情况,也调用了自身的 update() 方法并打印了第二句话。
相关推荐
Java内置的Observable类和Observer接口提供了基本的观察者模式功能,你可以通过继承Observable类和实现Observer接口来使用
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
用c++和lua实现的观察者模式小栗子,其中c++版本参考了别人的实现
观察者设计模式,java语言实现,完全自己代码实现,未使用observable和observer
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。 2.Observer(观察者) 为那些在目标发生改变时需获得通知的对象定义一个更新接口。 3.ConcreteSubject(具体目标) 将有关状态存入...
Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
Laravel开发-laravel-transaction-observer 观察延迟事件,并在完成所有事务后触发它们。
第 12 章 观察者模式 155 System.out.println("I have received the data:" +data); } } (5)一个简单的测试类 Test public class Test { public static void main(String[] args) { IObserver obs = new Observer...
设计模式C++学习之观察者模式(Observer)
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
Laravel开发-laravel-dynamic-observer 允许在模型本身中观察雄辩模型的包
观察者模式介绍:Observable和Observer原理分析,手动实现简单MyObservable和MyObserver
这样一来 当一个对象改变状态时 依赖它的对象都会收到通知并自动跟新 Java已经提供了对观察者Observer模式的默认实现 Java对观察者模式的支持主要体现在Observable类和Observer接口 ">观察者 Observer 模式定义:在...
观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。
Observer模式定义对象间的一对多的依赖关系,当一个对象(被观察者)的状态发生改变...从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
3.7.1. 目的 3.7.2. 例子 3.7.3. 注意 3.7.5. 代码 3.7.6. 测试
主要介绍了 Java观察者设计模式(Observable和Observer)的相关资料,需要的朋友可以参考下