
观察者模式
View Code View Code View Code View Code View Code View Code
发布日期:2021-05-09 09:33:46
浏览次数:4
分类:博客文章
本文共 3315 字,大约阅读时间需要 11 分钟。
观察者模式是对象的行为模式,又叫发布-订阅模式,模型-视图模式,源-监听器模式或者从属者模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。(解释引用于-java与模式)
客户端
package Observer;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2019-12-17 14:56 * @notify 模拟客户端 * @version 1.0 */public class Client { //如果在spring项目中,我们可以把subject注册到容器中。当前做法仅想表示初始化一次。 static OrderSubject subject = null; static { subject = new OrderSubject(); subject.attach(new ChangeAccount()); subject.attach(new ChangeInventory()); } public static void main(String[] args) { //用户购买商品,付款成功 Order order = new Order("张三", "苹果"); //调用所有监听者,执行各自操作 subject.notifyObservers(order); }}
业务pojo
package Observer;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2019-12-17 14:45 * @notify 用于模拟订单信息 * @version 1.0 */public class Order { public Order(String userId, String goodsId) { this.userId = userId; this.goodsId = goodsId; } //用户id private String userId; //商品id private String goodsId; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getGoodsId() { return goodsId; } public void setGoodsId(String goodsId) { this.goodsId = goodsId; }}
订阅主题
package Observer;import java.util.ArrayList;import java.util.List;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2019-12-17 10:49 * @notify 订单主题 * @version 1.0 */public class OrderSubject { private ListobserversList = new ArrayList<>(); //调用这个方法登记一个新的观察者对象 public void attach(Observer observer) { observersList.add(observer); } //调用这个方法删除一个已经登记过的观察者对象 public void detach(Observer observer) { observersList.remove(observer); } //调用这个方法通知所有登记过的观察者对象 public void notifyObservers(Order order) { for (Observer observer : observersList) { observer.excuse(order); } }}
观察者接口
package Observer;/** @auther 顶风少年 * @mail dfsn19970313@foxmail.com* @date 2019-12-17 10:56* @notify 观察者接口* @version 1.0*/public interface Observer { //执行具体的业务 void excuse(Order order);}
账户余额业务观察者实现
package Observer;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2019-12-17 14:51 * @notify 修改账户余额 * @version 1.0 */public class ChangeAccount implements Observer { //执行具体的业务 public void excuse(Order order) { String userId = order.getUserId(); System.out.println("正在修改用户:" + userId + "的账户余额"); System.out.println("账户余额修改成功"); }}
商品库存业务观察者实现
package Observer;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2019-12-17 14:51 * @notify 修改库存 * @version 1.0 */public class ChangeInventory implements Observer { //执行具体的业务 public void excuse(Order order) { String goodsId = order.getGoodsId(); System.out.println("正在修改商品:" + goodsId + "的库存数量"); System.out.println("库存数量修改成功"); }}
平时写crud时,会经常遇到上边的业务情况。当一个对象改变,往往需要修改与之相关联的其他几个对象,这里不如说修改其他表更为准确。上边例子,常规来讲我们在用户付款成功后,依次调用扣款接口,库存接口来进行相应的操作。这其实增强了,支付业务和扣款业务,库存业务的耦合性。使用观察者模式,支付业务无需知道用户付款成功后,需要做什么操作,只需要找到主题,然后将消息发布出去即可。其次,我们可以将不同的业务放到不同的订阅组中,观察者和观察者之间没有关联,订阅组和订阅组之间也没有关联。
观察者模式的缺点也很明显,当一个活动对象有多个观察者,多个观察者循环执行,如果一个观察者出错,就可能造成整个生态的崩溃。
转载地址:https://www.cnblogs.com/zumengjie/p/12054663.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2023年09月16日 06时17分56秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
利用栈完成进制转换(十进制转其它进制)
2019-03-08
1081: n个数求和 (多实例测试)
2019-03-08
1082: 敲7(多实例测试)
2019-03-08
队列的链式存储(C语言实现)
2019-03-08
二叉树的遍历(C语言实现)
2019-03-08
阶乘的最高位
2019-03-08
7744问题
2019-03-08
阶乘之和
2019-03-08
开灯问题
2019-03-08
归并排序
2019-03-08
P1219 [USACO1.5]八皇后 Checker Challenge(dfs)
2019-03-08
Lake Counting(DFS-深度优先搜索)
2019-03-08
P1025 [NOIP2001 提高组] 数的划分
2019-03-08
第二章 变量和基本类型
2019-03-08
二分模板
2019-03-08
P2249 【深基13.例1】查找
2019-03-08
方法的使用
2019-03-08
软件测试最最最基础,你需要知道的1234点
2019-03-08
蓝桥杯单片机数码管
2019-03-08
IDEA设置MAVEN仓库
2019-03-08