趣学设计模式之观察者模式
创作时间:
作者:
@小白创作中心
趣学设计模式之观察者模式
引用
CSDN
1.
https://blog.csdn.net/qq_56158663/article/details/145977864
这篇文章将带你详细认识设计模式中的观察者模式。
一、什么是观察者模式?
想象一下,你订阅了一个你喜欢的博主的博客。只要博主发布了新的文章,你就会立刻收到通知。观察者模式就像是这种订阅机制,当一个对象(博主)的状态发生改变时,所有依赖于它的对象(订阅者)都会收到通知并自动更新。
观察者模式,就是定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象的状态发生改变时,会通知所有观察者对象,使它们能够自动更新。
简单来说,就是让多个“粉丝”时刻关注着“偶像”,一旦“偶像”有啥动静,“粉丝”们立刻知道!
- 一个对象的状态改变需要通知多个其他对象:就像博主发布新文章需要通知所有订阅者!
- 对象之间的依赖关系应该是松耦合的:就像订阅者可以随时取消订阅,而不会影响博主的正常运作!
- 你需要实现发布-订阅(Publish-Subscribe)模式:就像博主发布文章,订阅者接收通知!
二、为什么要用观察者模式?
用观察者模式,好处多多:
- 解耦主题和观察者:主题对象不需要知道观察者对象的具体类型,只需要知道它们实现了观察者接口!
- 支持广播通信:主题对象可以同时通知多个观察者对象!
- 动态添加和删除观察者:可以方便地添加和删除观察者对象,而无需修改主题对象的代码!
- 提高代码的可维护性和可扩展性:将主题和观察者的逻辑分离,使得代码更加清晰易懂!
三、观察者模式的实现方式
观察者模式主要包含两个核心概念:
- 主题(Subject):也称为可观察对象,维护一个观察者列表,并提供添加、删除和通知观察者的方法!
- 观察者(Observer):定义了一个更新接口,当主题对象的状态发生改变时,会调用这个接口来通知观察者!
// 观察者接口:订阅者
public interface Observer {
void update(String message); // 更新消息
}
// 具体观察者:用户
public class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到消息: " + message);
}
}
// 主题接口:公众号
public interface Subject {
void registerObserver(Observer observer); // 注册观察者
void removeObserver(Observer observer); // 移除观察者
void notifyObservers(String message); // 通知观察者
}
// 具体主题:微信公众号
public class WeChatOfficialAccount implements Subject {
private List<Observer> observers = new ArrayList<>();
private String message;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
this.message = message;
for (Observer observer : observers) {
observer.update(message);
}
}
public void publishMessage(String message) {
System.out.println("公众号发布消息: " + message);
notifyObservers(message);
}
}
// 客户端
public class Client {
public static void main(String[] args) {
// 创建公众号
WeChatOfficialAccount officialAccount = new WeChatOfficialAccount();
// 创建用户
User user1 = new User("张三");
User user2 = new User("李四");
User user3 = new User("王五");
// 注册用户
officialAccount.registerObserver(user1);
officialAccount.registerObserver(user2);
officialAccount.registerObserver(user3);
// 发布消息
officialAccount.publishMessage("今天发布了一篇新文章!");
// 移除用户
officialAccount.removeObserver(user2);
// 再次发布消息
officialAccount.publishMessage("明天要举办一个活动!");
}
}
代码解释
Observer接口是观察者接口,定义了update方法,用于接收主题对象发送的通知。User类是具体观察者,实现了Observer接口,负责处理接收到的通知。Subject接口是主题接口,定义了registerObserver、removeObserver和notifyObservers方法,用于管理观察者列表和发送通知。WeChatOfficialAccount类是具体主题,实现了Subject接口,负责维护观察者列表和发送通知。
输出结果
公众号发布消息: 今天发布了一篇新文章!
张三 收到消息: 今天发布了一篇新文章!
李四 收到消息: 今天发布了一篇新文章!
王五 收到消息: 今天发布了一篇新文章!
公众号发布消息: 明天要举办一个活动!
张三 收到消息: 明天要举办一个活动!
王五 收到消息: 明天要举办一个活动!
四、观察者模式的优缺点
优点:
- 解耦主题和观察者!
- 支持广播通信!
- 动态添加和删除观察者!
- 提高代码的可维护性和可扩展性!
缺点:
- 如果观察者过多,通知会消耗大量资源!
- 观察者之间可能存在循环依赖,导致系统崩溃!
- 难以保证通知的可靠性,如果某个观察者处理通知失败,可能会影响其他观察者!
五、观察者模式的应用场景
- GUI 事件处理:按钮点击、鼠标移动等等!
- 消息队列:发布-订阅模式!
- 股票行情:股票价格变化通知!
- 天气预报:天气变化通知!
六、总结
- 观察者模式就像“偶像”和“粉丝”,一旦“偶像”有啥动静,“粉丝”们立刻知道!
- 核心概念包括主题和观察者!
- 优点是解耦主题和观察者、支持广播通信、动态添加和删除观察者、提高代码的可维护性和可扩展性!
- 缺点是如果观察者过多,通知会消耗大量资源、观察者之间可能存在循环依赖、难以保证通知的可靠性!
- 适用于一个对象的状态改变需要通知多个其他对象,并且对象之间的依赖关系应该是松耦合的场景!
希望这篇文章能让你彻底理解观察者模式!祝你学习愉快!
热门推荐
梅子酒的功效与作用
思域FK8是什么车?
最高年化利率降至“2”字头 个人养老金储蓄类产品吸引力几何?
单身男领养小孩需要什么条件
吃不完的小葱怎么保存
道家九字真言是哪几个?分别有什么含义?
印度股市连续上涨或告终:专家警告经济放缓与货币紧缩双重压力
贵州上亿年的“地质奇缘”
如何探索多元化的收入来源?这些来源如何提升财务自由度?
MBTI测试有什么弊端?全面解析其局限性与争议
那些选择断崖式失联的人,怎么了?
《鬼谷子精要》:古代智慧的现代启示
员工拒绝出差,公司可以解除劳动合同吗?
油吃不对,真的很危险!尤其这类人
九里香适合在哪里种植?养殖方法及注意事项全解析
腰椎间盘突出手术后多久能恢复正常生活?
如何控制油门以保持匀速行驶?油门控制的技巧和注意事项是什么?
梅子上市成熟季节详解(了解梅子成熟的时间)
专注力的秘密:如何用“眼球运动法”激活你的大脑
李香君与侯方域:爱情与忠贞的传奇故事
经济好转的时机如何判断?这种判断依据有哪些?
5种实用的视频文件加密方法,保护你的视频内容安全
年轻人开始“反向消费”了,这是怎么回事?什么是反向消费?
左侧交易和右侧交易的定义和区别是什么?这两种策略各有什么优缺点?
二手车过户后怎么上牌?这种操作对车辆合法性有何影响?
同事之间的小矛盾不断积累,如何防止矛盾升级
汽车财务预算:从购车到用车的全面指南
出示证件即可入住,南京酒店无需“刷脸”
莫斯科惨剧:德军冻成冰雕,为何不烧树木取暖?苏联战术是什么
戏内与戏外,瑞安·雷诺兹与“死侍”的不解之缘