观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生改变时,它的所有依赖者(观察者)都会自动收到通知并更新。
观察者模式主要由以下四个角色组成:
- Subject(主题):定义了被观察的对象,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。主题提供一个接口,可以增加和删除观察者对象,主题在状态改变时,会通知所有观察者。
- Observer(观察者):为那些在主题发生改变时需要获得通知的对象定义一个接口。
- ConcreteSubject(具体主题):将观察者保存在一个集合中,并在状态发生改变时通知他们。
- ConcreteObserver(具体观察者):实现观察者接口,以便在主题的状态发生改变时更新自身状态。
在Java中实现观察者模式,我们可以使用Java内置的java.util.Observable
和java.util.Observer
接口。下面是一个简单的例子:
import java.util.Observable; import java.util.Observer; // 具体观察者 class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } @Override public void update(Observable o, Object arg) { System.out.println(name + "收到通知:" + arg); } } // 具体主题 class ConcreteSubject extends Observable { private String state; public void setState(String state) { this.state = state; // 当状态改变时,通知所有观察者 setChanged(); notifyObservers(state); } public String getState() { return state; } } public class ObserverPatternDemo { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); Observer observer1 = new ConcreteObserver("观察者1"); Observer observer2 = new ConcreteObserver("观察者2"); subject.addObserver(observer1); subject.addObserver(observer2); subject.setState("新状态"); } }
在这个例子中,当ConcreteSubject
的状态改变时,它会通知所有注册的观察者。每个观察者都会收到通知并更新自身状态。
注意,虽然Java内置了观察者模式的接口,但在实际开发中,我们可能会选择自己实现这些接口,以便更灵活地控制主题和观察者的行为。此外,还有其他一些库和框架也提供了观察者模式的实现,如RxJava等。