设计模式Java实现-观察者模式
✨这里是第七人格的博客✨小七,欢迎您的到来~✨
🍅系列专栏:设计模式🍅
✈️本篇内容: 观察者模式✈️
🍱 本篇收录完整代码地址:gitee.com/diqirenge/d… 🍱
楔子
在现代软件开发中,设计模式的运用如同指南针,引领我们更好地构建易于维护、扩展和理解的代码结构。在众多的设计模式之中,观察者模式以其独特的魅力,让我们在面对“一对多”的依赖关系时,能够优雅地解耦和响应变化。本文将带您深入探索观察者模式的世界,通过Java语言的实现,感受其在实际应用中的威力。
需求背景
随着互联网的快速发展,各种实时数据服务如雨后春笋般涌现。以股票交易系统为例,股票价格的变化是实时、频繁的,而投资者们需要及时获取这些变化信息,以便做出投资决策。传统的轮询方式显然无法满足实时性的要求,同时还会造成资源的浪费。观察者模式应运而生,它允许一个对象(股票)维护一个依赖它的对象列表(投资者),并在状态发生变化时自动通知所有依赖它的对象。
分析设计
我们需要定义一个Stock类作为可被观察的对象(Subject),它维护了一个观察者列表,并提供了注册、注销观察者和通知观察者的方法。还需要定义一个Investor类实现观察者接口,用于响应股票价格的变化。
UML图
根据分析设计,我们可以先画一个简单的UML图,后面通过UML图编码
模块名称
observer
模块地址
模块描述
观察者模式代码示例
代码实现
1、编写观察者接口
/**
* 观察者接口
* 关注公众号【奔跑的码畜】,一起进步不迷路
*
* @author 第七人格
* @date 2024/06/17
*/
interface Observer {
void update(double newPrice);
}
2、编写需要被订阅的主题接口
/**
* 主题接口
* 关注公众号【奔跑的码畜】,一起进步不迷路
*
* @author 第七人格
* @date 2024/06/17
*/
interface Subject {
/**
* 注册观察者
*
* @param observer 观察者
*/
void registerObserver(Observer observer);
/**
* 注销观察者
*
* @param observer 观察者
*/
void unregisterObserver(Observer observer);
/**
* 通知观察者
*
* @param newPrice 新价格
*/
void notifyObservers(double newPrice);
}
3、编写股票类
/**
* 股票
* 需要订阅主题
*
* @author lizongyang
* @date 2024/06/17
*/
class Stock implements Subject {
/**
* 维护一个观察者列表
*/
private final List<Observer> observers = new ArrayList<>();
/**
* 价格
*/
private double price;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void unregisterObserver(Observer observer) {
System.out.println("移除观察者: " + ((Investor) observer).getName());
observers.remove(observer);
}
@Override
public void notifyObservers(double newPrice) {
for (Observer observer : observers) {
observer.update(newPrice);
}
}
public void setPrice(double price) {
this.price = price;
// 价格变动后通知所有观察者
notifyObservers(price);
}
public double getPrice() {
return price;
}
}
4、编写投资者
/**
* 投资者 - 观察者
* 关注公众号【奔跑的码畜】,一起进步不迷路
*
* @author 第七人格
* @date 2024/06/17
*/
public class Investor implements Observer {
private final String name;
public Investor(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void update(double newPrice) {
System.out.println(name + ": 通知一个新的股票价格: " + newPrice);
}
}
5、编写测试类
/**
* 观察者测试类
* 关注公众号【奔跑的码畜】,一起进步不迷路
*
* @author 第七人格
* @date 2024/06/17
*/
public class ObserverTest {
@Test
public void testObserver() {
Stock stock = new Stock();
Observer investor1 = new Investor("投资者-1");
Observer investor2 = new Investor("投资者-2");
stock.registerObserver(investor1);
stock.registerObserver(investor2);
stock.setPrice(10.50);
stock.unregisterObserver(investor1);
stock.setPrice(11.00);
}
}
6、测试结果
投资者-1: 通知一个新的股票价格: 10.5
投资者-2: 通知一个新的股票价格: 10.5
移除观察者: 投资者-1
投资者-2: 通知一个新的股票价格: 11.0
实现要点
- 定义观察者接口:观察者接口定义了观察者需要实现的方法,即当被观察对象状态发生变化时,观察者需要执行的操作。在本例中,我们定义了Observer接口,其中的update方法用于接收新的股票价格。
- 定义主题接口:主题接口定义了被观察对象需要提供的方法,包括注册观察者、注销观察者和通知观察者。我们定义了Subject接口,其中包含了这些方法。
- 实现主题类:股票类实现了主题接口,它维护了一个观察者列表,并在价格发生变化时通过遍历列表来通知所有观察者。此外,股票类还提供了注册、注销观察者和设置价格的方法。
- 实现观察者类:投资者类实现了观察者接口,用于响应股票价格的变化。在接收到通知时,投资者类会输出一条包含投资者姓名和新股票价格的消息。
- 编写测试类:测试类用于验证观察者模式的实现是否正确。我们创建了一个股票对象和两个投资者对象,并将它们关联起来。然后,我们改变了股票的价格,并观察了投资者的反应。
总结
观察者模式是一种非常实用的设计模式,它允许我们以一种松耦合的方式处理对象之间的依赖关系。在本文中,我们通过Java语言实现了观察者模式,并将其应用于股票交易系统的示例中。通过定义观察者接口、主题接口和相应的实现类,我们成功地构建了一个能够实时响应股票价格变化的系统。这不仅提高了代码的复用性和可维护性,还降低了对象之间的耦合度。希望本文能够为您在实际开发中运用观察者模式提供一些启示和帮助。
转载自:https://juejin.cn/post/7383947682597126153