什么是观察者模式?
观察者设计模式能够更便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能性。
该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。
UML
该图详细说明了一个使用观察者设计模式的类设计:
下面是对上图的说明:
1.MyObject是可观察对象,它包含一个名为observers的观察者保护数组。公共方法addObserver()接受一个观察者的实例并将其存储在观察者数组内。
2.doSomething()公共方法会被调用,这个方法对MyObject应用状态变化。随后,notify()公共方法会被调用,这个方法可遍历循环观察者数组。
3.MyObjectObserver具有一个名为change()的公共方法,该方法接受MyObject的一个实例。这个特定的观察者接下来会对MyObject的内容执行某些操作。当在观察者数组中找到特定的观察者时,MyObject的notify()方法会直接调用change()方法。
使用实例:
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 70 71 72 73 74 75 76 77 78 79 80 |
|
代码中可以看到login对象主动添加SecurityMonitor对象观察。这样要调用Login::getStatus(),SecurityMonitor类就必须了解更多信息。虽然调用发生于一个ObServable对象上,但无法保证对象也是一个Login对象。为解决这个问题,有一个办法:断续保持ObServable接口的通用性,由ObServer类负责保证它们的主体是正确的类型。它们甚至能将自己添加到主体上。