趣学设计模式之观察者模式
创作时间:
作者:
@小白创作中心
趣学设计模式之观察者模式
引用
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 事件处理:按钮点击、鼠标移动等等!
- 消息队列:发布-订阅模式!
- 股票行情:股票价格变化通知!
- 天气预报:天气变化通知!
六、总结
- 观察者模式就像“偶像”和“粉丝”,一旦“偶像”有啥动静,“粉丝”们立刻知道!
- 核心概念包括主题和观察者!
- 优点是解耦主题和观察者、支持广播通信、动态添加和删除观察者、提高代码的可维护性和可扩展性!
- 缺点是如果观察者过多,通知会消耗大量资源、观察者之间可能存在循环依赖、难以保证通知的可靠性!
- 适用于一个对象的状态改变需要通知多个其他对象,并且对象之间的依赖关系应该是松耦合的场景!
希望这篇文章能让你彻底理解观察者模式!祝你学习愉快!
热门推荐
广州十大亲子游胜地:科技馆、动物园、过山车一网打尽
吊销营业执照≠公司注销,忽视后续程序或致严重后果
自驾游打卡恩施大峡谷:绝美风景与土家文化完美融合
宜昌到恩施自驾游:两大峡谷如何选?
药物治疗为主,偏执型精神分裂症可治但难根治
黄山十大特色小吃全攻略:从烧饼到观音豆腐
徐汇区家政技能培训:五十岁以上人群速成指南
适合晚餐吃的食物有哪些?这8种食物营养又健康
文峰、钟楼、白塔:安阳三塔的历史与艺术价值
游安阳必去两处:5A大峡谷和“世界第八奇迹”
安阳周边三城游:鹤壁邯郸濮阳文旅全攻略
中俄边界问题彻底解决,但俄方仍有戒备
中美经贸持久战:中国以科技创新和内需驱动赢得未来
沙棘原浆配驼奶粉:中医调理湿气的新选择
顺义老中医吴广义:湿气形成6大原因与调理全攻略
湿气重如何调理?中医专家详解病因、调理方法和预防要点
南诏国:从大唐附属到西南霸主,七王三帝164年兴衰史
NGK火花塞升级,让你的座驾焕发新生
武汉地铁4号线直达东湖磨山赏花胜地,80万株杜鹃花海等你来!
印度洋上的观鲸天堂:毛里求斯四大胜地全攻略
掼蛋出圈,“社交神器”带火周边产品,你“掼”了吗?
丰台区有什么好玩的景点
中国造船业前三季度三大指标大幅增长,连续14年全球第一
薏米配山药:秋冬养生祛湿补虚的完美搭档
69岁周润发患肿瘤?本人最新回应
揭秘成龙:70岁仍活跃一线,他的身体为何如此健康?
眉心痛自我按摩指南:从穴位定位到操作步骤
水管堵塞的救星:4 招簡單方法讓你不再煩惱
王星事件再掀电诈热议:跨境诈骗为何屡禁不止?
六大科学预防策略,远离色斑困扰:成因、类型全解析