5-7-java-Observer接口和Observable类

文章目录
  1. 1. 举个例子
  2. 2. 代码实例

举个例子

例如现在房地产调控比较严格,很多购房者都在关注着房子的价格变化,每当房子价格变化时,所有的购房者都可以观察得到。实际上以上的购房者都属于观察者,他们都在关注着房子的价格。这个观察变化的过程就可以成为观察者模式。

如果实现观察模式
在 Java 中可以直接依靠类 Observable 和 接口 Observer实现以上观察者模式的功能。在Java 应用中,需要被观察的类必须继承于 Observable 类。每个观察者类都需要实现 Observer 接口,其定义如下:

1
2
3
4
public interface Observer{
// 第一个参数表示被观察者实例,第二参数表示修改的内容
void update(Observable o, Object arg)
}

代码实例

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
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.Observable;
import java.util.Observer;

// 继承 Observable 表示房子可以被观察
class House extends Observable{
private float price; // 价钱
public House(float price) {
this.setPrice(price);
}

public float getPrice() {
return price;
}

public void setPrice(float price) {
// 每一次修改的时候都引起观察者的注意
super.setChanged(); // 设置变化点
super.notifyObservers(price); // 价格被改变
this.price = price;
}

public String toString() {
return "房价为:"+this.price;
}
}

// 设置房子的具体观察者
class HousePriceObserver implements Observer{
private String name;
public HousePriceObserver(String name) {
// 设置每一个观察的名字
this.name = name;
}

/**
* 当变化之后,就会自动触发该方法
*/
@Override
public void update(Observable o, Object arg) {
if(arg instanceof Float){
System.out.println(this.name+" 观察到价格更改为:" + arg);
}
}
}

public class TestObserve {
public static void main(String[] args) {
// 创建可观察对象
House h = new House(100000);
// 创建购房者
HousePriceObserver hpo1 = new HousePriceObserver("购房者 A");
HousePriceObserver hpo2 = new HousePriceObserver("购房者 B");
HousePriceObserver hpo3 = new HousePriceObserver("购房者 C");
// 添加可观察对象
h.addObserver(hpo1);
h.addObserver(hpo2);
h.addObserver(hpo3);
System.out.println(h); // 输出房子的价格
h.setPrice(600000); // 修改房子价格
System.out.println(h); // 输出房子的价格
}
}

控制台输出

房价为:100000.0
购房者 C 观察到价格更改为:600000.0
购房者 B 观察到价格更改为:600000.0
购房者 A 观察到价格更改为:600000.0
房价为:600000.0