主页 > 其他  > 

(十八)趣学设计模式之观察者模式!

(十八)趣学设计模式之观察者模式!

目录 一、 啥是观察者模式?二、 为什么要用观察者模式?三、 观察者模式的实现方式四、 观察者模式的优缺点五、 观察者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗! 🌟了解状态模式请看: (十 七)趣学设计模式 之 状态模式! ✨更多请看个人主页: 码熔burning

这篇文章带你详细认识一下设计模式中的观察者模式

一、 啥是观察者模式?

想象一下,你订阅了一个你喜欢的博主的博客 ✍️。 只要博主发布了新的文章,你就会立刻收到通知 🔔。 观察者模式就像是这种订阅机制,当一个对象(博主)的状态发生改变时,所有依赖于它的对象(订阅者)都会收到通知并自动更新。

观察者模式,就是定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象的状态发生改变时,会通知所有观察者对象,使它们能够自动更新 🎁。

简单来说,就是让多个“粉丝”时刻关注着“偶像”,一旦“偶像”有啥动静,“粉丝”们立刻知道!

一个对象的状态改变需要通知多个其他对象: 就像博主发布新文章需要通知所有订阅者 📢!对象之间的依赖关系应该是松耦合的: 就像订阅者可以随时取消订阅,而不会影响博主的正常运作 🤝!你需要实现发布-订阅(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 事件处理: 按钮点击、鼠标移动等等 🖱️!消息队列: 发布-订阅模式 📨!股票行情: 股票价格变化通知 📈!天气预报: 天气变化通知 ☀️🌧️! 六、 总结 观察者模式就像“偶像”和“粉丝”,一旦“偶像”有啥动静,“粉丝”们立刻知道! 🤩核心概念包括主题和观察者! 🔑优点是解耦主题和观察者、支持广播通信、动态添加和删除观察者、提高代码的可维护性和可扩展性! 👍缺点是如果观察者过多,通知会消耗大量资源、观察者之间可能存在循环依赖、难以保证通知的可靠性! 👎适用于一个对象的状态改变需要通知多个其他对象,并且对象之间的依赖关系应该是松耦合的场景! 🎯

希望这篇文章能让你彻底理解观察者模式! 💯 祝你学习愉快! 😄 看完请看:(十 九)趣学设计模式 之 中介者模式!

标签:

(十八)趣学设计模式之观察者模式!由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“(十八)趣学设计模式之观察者模式!