🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
津津乐道设计模式 - 观察者模式详解
- 什么是观察者模式
- 观察者模式适用场景
- 生活案例
- 案例代码
- 观察者模式优缺点
- 结语
什么是观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新
在观察者模式中,存在两个主要角色:
Subject(主题)
:也称为被观察者或可观察者,它维护了一组观察者,并提供了用于添加、删除和通知观察者的方法。当其状态发生变化时,会通知所有观察者。
Observer(观察者)
:也称为订阅者或监听者,它定义了一个更新接口,用于接收主题的通知。当观察者接收到通知时,可以执行相应的操作。
观察者模式适用场景
观察者模式适用于以下场景:
-
当一个对象的改变需要同时通知其他对象,并且你不知道有多少对象需要被通知时,可以使用观察者模式。它将这种一对多的依赖关系进行了解耦,使得主题对象和观察者对象之间松耦合。
-
当一个对象的改变需要触发其他对象的特定行为时,可以使用观察者模式。观察者可以根据主题对象的状态变化来执行相应的操作,实现了对象之间的交互和协作。
-
当应用中的某个对象需要与多个其他对象进行交互,但又希望避免紧密耦合时,可以使用观察者模式。观察者模式使得主题对象和观察者对象之间只依赖于抽象接口,减少了对象间的直接依赖,提高了系统的灵活性和可扩展性。
观察者模式通过定义一对多的依赖关系,实现了对象间的松耦合和动态通知机制。它提供了一种简洁的方式来实现对象间的交互和协作,使得系统更加灵活、可扩展和易于维护。观察者模式在事件驱动、GUI开发、消息传递和订阅发布系统等领域广泛应用,比如微信消息动态通知、邮件通知、广播通知等。
生活案例
现实生活中,你会发现你的女朋友心思很难猜透,你是不是也经常遇到这样的情况:
- 她有时候说:
不想要
(其实她想要) - 她有时候说:
我没生气
(实际上心里已经气鼓鼓的) - 她有时候说:
我走吧 不用管我了
(你敢走 老娘跟你没完) - 她有时候说:
怎么可能是你的错,都是我的错
(老娘怎么会犯错,再不跟我道歉,立马叫你好看)
诸多种种,是不是让你莫名其妙,毫无招架之力?那么跟着博主学会了本章观察者模式让你学会察言观色再也不怕女朋友生气了,哈哈哈~
案例代码
假设你想了解你的女朋友的情绪状态,并根据她的表情和言辞来判断她的心情。现在我们使用观察者模式来设计这个场景
首先,我们定义一个观察者接口,表示观察者:
public interface Observer {
void update(String expression, String words);
}
然后,我们定义一个主题类,表示你的女朋友:
import java.util.ArrayList;
import java.util.List;
public class Girlfriend {
private List<Observer> observers = new ArrayList<>();
private String expression;
private String words;
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void setMood(String expression, String words) {
this.expression = expression;
this.words = words;
notifyObservers();
}
private void notifyObservers() {
for (Observer observer : observers) {
observer.update(expression, words);
}
}
}
接下来,我们定义具体观察者类,表示你:
public class You implements Observer {
private String name;
public You(String name) {
this.name = name;
}
//举例根据女友言语做出的反应
public void doSomething(String words){
if(words.equals("太贵了我不想要")){
System.out.println(name + "做出反应: 赶紧给她买");
}
if(words.equals("怎么可能是你的错,都是我的错!")){
System.out.println(name + "做出反应: 赶紧给她道歉");
}
}
@Override
public void update(String expression, String words) {
System.out.println(name + "观察到: 她的表情是" + expression + ",她说:" + words);
doSomething(words);
}
}
现在,我们可以使用观察者模式来模拟观察女朋友的情绪变化,例如:
public class ObserverPatternTest {
public static void main(String[] args) {
Girlfriend girlfriend = new Girlfriend();
You you1 = new You("小明");
girlfriend.addObserver(you1);
girlfriend.setMood("开心", "太贵了我不想要");
girlfriend.setMood("生气", "怎么可能是你的错,都是我的错!");
}
}
结果输出如下:
通过观察者模式,当你的女朋友的情绪发生变化时,你作为观察者会立即收到通知,并根据她的表情和言辞来了解她的心情状态。这样,你就可以及时做出相应的回应和关心。
观察者模式优缺点
观察者模式的优点
- 解耦性:观察者模式可以将观察者和被观察者之间的关系解耦,使它们可以独立地进行修改和扩展,互不影响。
- 扩展性:通过添加新的观察者,可以方便地扩展系统功能,而无需修改原有的代码。
- 可重用性:观察者模式可以将观察者和被观察者进行分离,使它们可以被其他模块复用。
- 灵活性:观察者模式允许观察者根据需要订阅和取消订阅被观察者的通知,从而实现动态的观察者列表。
观察者模式的缺点
- 增加了复杂性:引入观察者模式会增加系统的复杂性,因为观察者和被观察者之间需要建立关联关系,并且观察者之间也可能存在相互依赖的关系。
- 内存泄漏风险:如果观察者没有被正确地移除或管理,可能会导致内存泄漏问题。
- 通知顺序问题:观察者模式中,观察者的通知顺序可能是不确定的,这对某些特定场景下可能会造成影响。
需要根据具体的应用场景和系统需求来权衡观察者模式的优缺点,并选择合适的设计模式。
结语
本章节主要讲解观察者模式应用场景、观察者模式优缺点,并以生活中女朋友情绪、语言的案例,结合观察者模式了解她的心情状态,迅速做出相应的回应和关心,再也不怕女朋友生气了。如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~
样例代码:https://github.com/lhmyy521125/toher-designmode