0%

观察者模式

思想

类中持有一个观察者类对象集合,当类对象变化时能够通知并执行观察者对应方法;

描述

不涉及继承

其他

类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系

UML

101e239e5d6a417a9bbc7caa12b29ddb

示例

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
63
64
65
66
67
68
69
//接口
interface Source {
public void name();
}
//实现类
class Animal implements Source {
@Override
public void name(){
Test.printMsg("Animal.name");
};
}
class Person implements Source {
@Override
public void name(){
Test.printMsg("Person.name");
};
}
// 接口
interface Project {
//增加源
public void add(Source source);
//删除
public void del(Source source);
//通知所有
public void notifys();
//操作
public void operation();
}
//实现类
abstract class Subject implements Project {
private Vector<Source> vector = new Vector<Source>();
@Override
public void add(Source observer) {
vector.add(observer);
}

@Override
public void del(Source observer) {
vector.remove(observer);
}

@Override
public void notifys() {
Enumeration<Source> enumo = vector.elements();
while(enumo.hasMoreElements()){
enumo.nextElement().name();
}
}
}
//实现
class MySubject extends Subject {
@Override
public void operation(){
Test.printMsg("MySubject.operation");
notifys();
}
}
//测试
public class Test {
public static void printMsg(String msg){
System.out.println(msg);
}
public static void main(String[] args){
Project proj = new MySubject();
proj.add(new Animal());
proj.add(new Person());
proj.operation();
}
}