欢迎来到设计模式系列的第十三篇文章!在之前的文章中,我们学习了许多常用的设计模式,今天我们将介绍观察者模式,它是一种行为型设计模式,用于定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。
在学习观察者模式前,我们可以带着一下三个问题来学习:
1.谁是观察者,谁又是被观察者?
2.观察者如何”观察”被观察者的?
3.为什么要使用观察着模式?
4.你在工作中见过哪些观察者模式?
观察者模式是一种常用的设计模式,它用于构建对象之间的发布-订阅(Publish-Subscribe)关系。在观察者模式中,有两类核心角色:
观察者模式的核心思想是降低主题和观察者之间的耦合度,使得它们可以独立地变化。这种松耦合的设计可以更好地支持可维护性和可扩展性。
在软件开发中,经常会遇到一对多的场景,例如:
如果没有观察者模式,我们可能会采用硬编码的方式来实现这些通知,但这样会导致高耦合和不易维护的问题。观察者模式通过将主题和观察者分离,使得它们可以独立变化,从而更好地应对这类场景。
观察者模式的实现通常包括以下几个关键元素:
update
方法。update
方法会被调用。现在,让我们通过一个示例来演示观察者模式的实现。假设我们正在开发一个简单的股票市场应用,股票价格会不断变化,我们需要通知多个投资者股票价格的变化情况。
首先,我们定义观察者接口 Observer
:
public interface Observer {
void update(double price);
}
然后,我们定义主题接口 Subject
:
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
接下来,我们创建一个具体主题 StockMarket
,它继承了 Subject
接口:
import java.util.ArrayList;
import java.util.List;
public class StockMarket implements Subject {
private List<Observer> observers = new ArrayList<>();
private double price;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(price);
}
}
public void setPrice(double price) {
this.price = price;
notifyObservers();
}
}
在 StockMarket
类中,我们维护了一个观察者列表 observers
和股票价格 price
。当 setPrice
方法被调用时,会通知所有注册的观察者。
接下来,我们创建一个具体观察者 Investor
,它实现了 Observer
接口:
public class Investor implements Observer {
private String name;
public Investor(String name) {
this.name = name;
}
@Override
public void update(double price) {
System.out.println(name + " 收到股票价格更新,当前价格为 " + price);
}
}
最后,我们可以测试观察者模式的效果:
public class Main {
public static void main(String[] args) {
StockMarket stockMarket = new StockMarket();
Investor investor1 = new Investor("Alice");
Investor investor2 = new Investor("Bob");
stockMarket.registerObserver(investor1);
stockMarket.registerObserver(investor2);
stockMarket.setPrice(100.0);
stockMarket.setPrice(105.0);
stockMarket.removeObserver(investor1);
stockMarket.setPrice(110.0);
}
}
以上代码创建了一个股票市场 StockMarket
和两个投资者 Investor
,并演示了股票价格的变化如何通知投资者。
观察者模式具有许多优点,使其成为软件开发中常用的设计模式之一:
观察者模式也存在一些缺点,需要考虑:
观察者模式适用于以下场景:
观察者模式在现实世界和软件开发中都有广泛应用。以下是一些实际应用示例:
在使用观察者模式时,有一些最佳实践值得注意:
想进一步了解观察者模式的老铁可以了解一下 spring中的事件机制:深入理解事件发布监听机制
观察者模式是一种非常有用的设计模式,用于实现对象之间的松耦合通信。通过定义一对多的依赖关系,主题状态变化时通知多个观察者,实现了对象之间的订阅机制。在实际应用中,观察者模式可以帮助我们构建灵活、可扩展的系统。