定义:定义对象间一种一对多的依赖关系,使得当每个对象改变状态,则全部依赖于它的对象都会获得通知并自动更新。 javascript
类型:行为类模式 java
类图: 设计模式
在软件系统中常常会有这样的需求:若是一个对象的状态发生改变,某些与它相关的对象也要随之作出相应的变化。好比,咱们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单;再好比,咱们要设计一个自动部署的功能,就像eclipse开发时,只要修改了文件,eclipse就会自动将修改的文件部署到服务器中。这两个功能有一个类似的地方,那就是一个对象要时刻监听着另外一个对象,只要它的状态一发生改变,本身随之要作出相应的行动。其实,可以实现这一点的方案不少,可是,无疑使用观察者模式是一个主流的选择。 api
观察者模式的结构 安全
在最基础的观察者模式中,包括如下四个角色: 服务器
观察者模式代码实现 多线程
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
|
abstract
class
Subject
{
private
Vector
<Observer>
obs
=
new
Vector
<Observer>
(
)
;
public
void
addObserver
(
Observer
obs
)
{
this
.
obs
.
add
(
obs
)
;
}
public
void
delObserver
(
Observer
obs
)
{
this
.
obs
.
remove
(
obs
)
;
}
protected
void
notifyObserver
(
)
{
for
(
Observer
o
:
obs
)
{
o
.
update
(
)
;
}
}
public
abstract
void
doSomething
(
)
;
}
class
ConcreteSubject
extends
Subject
{
public
void
doSomething
(
)
{
System
.
out
.
println
(
"被观察者事件反生"
)
;
this
.
notifyObserver
(
)
;
}
}
interface
Observer
{
public
void
update
(
)
;
}
class
ConcreteObserver1
implements
Observer
{
public
void
update
(
)
{
System
.
out
.
println
(
"观察者1收到信息,并进行处理。"
)
;
}
}
class
ConcreteObserver2
implements
Observer
{
public
void
update
(
)
{
System
.
out
.
println
(
"观察者2收到信息,并进行处理。"
)
;
}
}
public
class
Client
{
public
static
void
main
(
String
[
]
args
)
{
Subject
sub
=
new
ConcreteSubject
(
)
;
sub
.
addObserver
(
new
ConcreteObserver1
(
)
)
;
//添加观察者1
sub
.
addObserver
(
new
ConcreteObserver2
(
)
)
;
//添加观察者2
sub
.
doSomething
(
)
;
}
}
|
运行结果 eclipse
被观察者事件反生 性能
观察者1收到信息,并进行处理。 this
观察者2收到信息,并进行处理。
经过运行结果能够看到,咱们只调用了Subject的方法,但同时两个观察者的相关方法都被同时调用了。仔细看一下代码,其实很简单,无非就是在Subject类中关联一下Observer类,而且在doSomething方法中遍历一下Observer的update方法就好了。
观察者模式的优势
观察者与被观察者之间是属于轻度的关联关系,而且是抽象耦合的,这样,对于二者来讲都比较容易进行扩展。
观察者模式是一种经常使用的触发机制,它造成一条触发链,依次对各个观察者的方法进行处理。但同时,这也算是观察者模式一个缺点,因为是链式触发,当观察者比较多的时候,性能问题是比较使人担心的。而且,在链式结构中,比较容易出现循环引用的错误,形成系统假死。
总结
java语言中,有一个接口Observer,以及它的实现类Observable,对观察者角色常进行了实现。咱们能够在jdk的api文档具体查看这两个类的使用方法。
作过VC++、javascript DOM或者AWT开发的朋友都对它们的事件处理感到神奇,了解了观察者模式,就对事件处理机制的原理有了必定的了解了。若是要设计一个事件触发处理机制的功能,使用观察者模式是一个不错的选择,AWT中的事件处理DEM(委派事件模型Delegation Event Model)就是使用观察者模式实现的。