✨这里是第七人格的博客✨小七,欢迎您的到来~✨
🍅系列专栏:设计模式🍅
✈️本篇内容: 观察者模式✈️
🍱 本篇收录完整代码地址:https://gitee.com/diqirenge/design-pattern 🍱
在现代软件开发中,设计模式的运用如同指南针,引领我们更好地构建易于维护、扩展和理解的代码结构。在众多的设计模式之中,观察者模式以其独特的魅力,让我们在面对“一对多”的依赖关系时,能够优雅地解耦和响应变化。本文将带您深入探索观察者模式的世界,通过Java语言的实现,感受其在实际应用中的威力。
随着互联网的快速发展,各种实时数据服务如雨后春笋般涌现。以股票交易系统为例,股票价格的变化是实时、频繁的,而投资者们需要及时获取这些变化信息,以便做出投资决策。传统的轮询方式显然无法满足实时性的要求,同时还会造成资源的浪费。观察者模式应运而生,它允许一个对象(股票)维护一个依赖它的对象列表(投资者),并在状态发生变化时自动通知所有依赖它的对象。
我们需要定义一个Stock类作为可被观察的对象(Subject),它维护了一个观察者列表,并提供了注册、注销观察者和通知观察者的方法。还需要定义一个Investor类实现观察者接口,用于响应股票价格的变化。
根据分析设计,我们可以先画一个简单的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
观察者模式是一种非常实用的设计模式,它允许我们以一种松耦合的方式处理对象之间的依赖关系。在本文中,我们通过Java语言实现了观察者模式,并将其应用于股票交易系统的示例中。通过定义观察者接口、主题接口和相应的实现类,我们成功地构建了一个能够实时响应股票价格变化的系统。这不仅提高了代码的复用性和可维护性,还降低了对象之间的耦合度。希望本文能够为您在实际开发中运用观察者模式提供一些启示和帮助。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。