设计模式—行为型模式之观察者模式
设计模式—行为型模式之观察者模式
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。这是一种对象行为型模式。
观察者模式有如下角色:
-
Subject: 目标
-
ConcreteSubject: 具体目标
-
Observer: 观察者
-
ConcreteObserver: 具体观察者
示例
比如现在大火的主播,可以直播卖货,直播卖货时可以通知给粉丝,结束卖货时也可以通知给粉丝。我们可以在主播中维护一个粉丝的列表,来进行通知。
代码如下:
/**
* 抽象主播类
*/
public abstract class AbstarctAnchor {
//添加粉丝
abstract void addFans(AbstarctFans fans);
//通知粉丝
abstract void notifyFans(String msg);
}
/**
抽象粉丝类
*/
public abstract class AbstarctFans {
//接收消息
abstract void acceptMsg(String msg);
//关注主播
public void follow(AbstarctAnchor anchor){
anchor.addFans(this);
}
}
卖奥特曼的主播为:
/**
* 卖奥特曼的主播
*/
@Slf4j
public class SellingUltramanAnchor extends AbstarctAnchor{
//粉丝列表
private List<AbstarctFans> fansList = new ArrayList<>();
//卖奥特曼
public void selling(){
log.info("我是卖奥特曼的主播,我来卖奥特曼了....");
//通知粉丝
notifyFans("主播来卖货了");
}
//结束卖奥特曼
public void end(){
log.info("奥特曼卖没了....");
//通知粉丝
notifyFans("主播结束卖货了");
}
@Override
void addFans(AbstarctFans fans) {
fansList.add(fans);
}
@Override
void notifyFans(String msg) {
//获取所有粉丝进行通知
for (AbstarctFans abstarctFans : fansList) {
abstarctFans.acceptMsg(msg);
}
}
}
忠实粉丝和黑粉类如下
/**
* 忠实粉丝
*/
@Slf4j
public class LoyalFans extends AbstarctFans{
@Override
void acceptMsg(String msg) {
log.info("卖奥特曼的主播来了,他说:"+msg);
}
}
/**
* 黑粉
*/
@Slf4j
public class AntiFan extends AbstarctFans{
@Override
void acceptMsg(String msg) {
log.info("这个卖奥特曼的主播卖的奥特曼不会发光,别买!!!");
}
}
测试类如下
public class ObserverTest {
public static void main(String[] args) {
//卖奥特曼的主播对象
SellingUltramanAnchor anchor = new SellingUltramanAnchor();
//忠实粉丝1
AbstarctFans loyalFans1 = new LoyalFans();
loyalFans1.follow(anchor);
//忠实粉丝2
AbstarctFans loyalFans2 = new LoyalFans();
loyalFans2.follow(anchor);
//黑粉
AbstarctFans antiFan = new AntiFan();
antiFan.follow(anchor);
//开播
anchor.selling();
//结束直播
anchor.end();
}
}
运行结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效