返回
打破信息壁垒,探索观察者模式的艺术
前端
2023-11-19 16:07:35
小明打算去售楼处购买一套房子。销售小姐告诉他这套住宅暂时没有房源,于是小明留下了手机号码,以便在有房源时通知他。
上面示例中,发布者就是售楼中心,订阅者就是小明,消息队列就是小明留的手机号码。观察者模式让对象之间实现了松耦合。
一个简单的观察者模式示例:
class Subject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
class Observer {
public void update() {
// Do something
}
}
class ConcreteSubject extends Subject {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyObservers();
}
}
class ConcreteObserver implements Observer {
private Subject subject;
public ConcreteObserver(Subject subject) {
this.subject = subject;
subject.addObserver(this);
}
@Override
public void update() {
System.out.println("Observer: " + subject.getState());
}
}
public class Main {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer observer = new ConcreteObserver(subject);
subject.setState(1);
subject.setState(2);
}
}
在这个示例中,Subject
是抽象类,ConcreteSubject
是它的具体实现。Observer
是抽象类,ConcreteObserver
是它的具体实现。main()
方法创建了一个ConcreteSubject
对象和一个ConcreteObserver
对象,并将观察者添加到主题中。然后,setState()
方法被调用了两次,每次都调用notifyObservers()
方法,通知观察者状态已更改。观察者随后调用update()
方法,打印出主题的状态。
观察者模式有许多优点,包括:
- 松耦合:观察者和主题之间是松散耦合的,这意味着它们可以独立更改。
- 可扩展性:可以轻松地向系统中添加新的观察者,而无需更改主题或其他观察者。
- 代码重用:观察者模式可以帮助您重用代码,因为您可以创建可以由多个主题使用的观察者。
观察者模式在许多不同的应用程序中都很有用,包括:
- GUI编程:观察者模式可以用于在GUI控件(如按钮和文本框)和它们的监听器之间建立通信。
- 事件处理:观察者模式可以用于处理来自操作系统或其他应用程序的事件。
- 数据绑定:观察者模式可以用于将数据模型与GUI控件绑定在一起,以便在数据模型发生更改时更新GUI控件。