当观察对象的状态发生变化时,会通知给观察者。适用于根据对象状态进行相应处理的场景。
示例
观察者将观察一个会生成数值的对象,并将它生成的数值结果显示出来。不同的观察者的显示方式不一样。
类图
Observer接口
1 | public interface Observer { |
NumberGenerator类
1 | import java.util.ArrayList; |
RandomNumberGenerator类
1 | import java.util.Random; |
DigitObserver类
1 | public class DigitObserver implements Observer { |
GraphObserver类
1 | public class GraphObserver implements Observer { |
Main类
1 | public class Main { |
运行结果
1 | DigitObserver:14 |
登场角色
Subject(观察对象)
Subject角色表示观察对象。Subject角色定义了注册观察者和删除观察者的方法。此外,它还声明了“获取现在的状态”的方法。在示例程序中,由NumberGenerator类扮演此角色。
ConcreteSubject(具体的观察对象)
ConcreteSubject角色表示具体的被观察对象。当自身状态发生变化后,它会通知所有已经注册的Observer角色。在示例程序中,由RandomNumberGenerator类扮演此角色。
Observer(观察者)
Observer角色负责接收来自Subject角色的状态变化的通知。为此,它声明了update方法。在示例程序中,由Observer接口扮演此角色。
ConcreteObserver(具体的观察者)
ConcreteObserver角色表示具体的Observer。当它的update方法被调用后,会去获取要观察的对象的最新状态。在示例程序中,由DigitObserver类和GraphObserver类扮演此角色。