首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式之观察者模式

设计模式之观察者模式

作者头像
丁D
发布2022-08-12 20:48:38
发布2022-08-12 20:48:38
20100
代码可运行
举报
文章被收录于专栏:老铁丁D老铁丁D
运行总次数:0
代码可运行

什么是观察者模式

观察者模式定义了对象之间一种一对多的关系,即一个对象发生改变的时候,会通知其他相关的对象。

观察者模式的好处降低了观察目标(被观察者)和观者者的耦合关系。

使用场景:观察者模式一般用于订阅功能,微博订阅,当我们订阅了一个博主,当博主发布了文章就会通知我们。

我们看如上面的类图,它 其实就是2个接口和2个实现类。 subject(主题、观察目标、被观察者):这是一个接口定义了添加、删除、和通知观察者的方法 observer(观察者):这是一个接口定义了接收通知的方法。 concreateSubject:主题的具体实现方法,维护了一个观察者的list concreteObserber:观察者的具体实现方法。

实战小demo

我们假设本博客发布一篇文章,需要通知各位粉丝来阅读。 分析:主题、被观察者、观察者目标就是本博客,粉丝就是观察者。

被观察者接口

代码语言:javascript
代码运行次数:0
运行
复制
package com.ding; 
public interface Subject { 
public void addObserver(Observer observer); 
public void removeObserver(Observer observer); 
public void notifyObserver(); 
} 

观察者接口

代码语言:javascript
代码运行次数:0
运行
复制
package com.ding; 
public interface Observer { 
public void update(String msg); 
} 

被观察者实现类

代码语言:javascript
代码运行次数:0
运行
复制
package com.ding; 
import java.util.ArrayList; 
import java.util.List; 
public class BlogSubject implements Subject{ 
// 面向接口编程,这里泛型是接口 
private List<Observer> observerList = new ArrayList<>(); 
/** 
* 添加观察者 
*/ 
@Override 
public void addObserver(Observer observer) { 
this.observerList.add(observer); 
} 
/** 
* 移除观察者 
*/ 
@Override 
public void removeObserver(Observer observer) { 
this.observerList.remove(observer); 
} 
/** 
* 发生改变通知所有的观察者 
*/ 
@Override 
public void notifyObserver() { 
this.observerList.forEach(o->{ 
o.update("我发布了新的文章。。。"); 
}); 
} 
} 

观察者实现类

代码语言:javascript
代码运行次数:0
运行
复制
package com.ding; 
public class FansObserver1 implements Observer{ 
@Override 
public void update(String msg) { 
System.out.println("我是粉丝1:" + msg); 
} 
} 

测试

代码语言:javascript
代码运行次数:0
运行
复制
package com.ding; 
public class ObserverTest { 
public static void main(String[] args) { 
BlogSubject blogSuject = new BlogSubject(); 
FansObserver1 fans1 = new FansObserver1(); 
FansObserver2 fans2 = new FansObserver2(); 
blogSuject.addObserver(fans1); 
blogSuject.addObserver(fans2); 
blogSuject.notifyObserver(); 
System.out.println("----------分割---------"); 
blogSuject.removeObserver(fans1); 
blogSuject.notifyObserver(); 
} 
} 
输出 
我是粉丝1:我发布了新的文章。。。 
我是粉丝2:我发布了新的文章。。。 
----------分割--------- 
我是粉丝2:我发布了新的文章。。。 

java自带的观察者模式

累了,以后再写

这短短的一生我们最终都会失去,不妨大胆一点,爱一个人,攀一座山,追一个梦

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是观察者模式
  • 实战小demo
  • java自带的观察者模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档