前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java监听设计模式(java观察者设计模式)

java监听设计模式(java观察者设计模式)

作者头像
全栈程序员站长
发布于 2021-12-23 04:31:11
发布于 2021-12-23 04:31:11
79700
代码可运行
举报
运行总次数:0
代码可运行

今天给大家分享一下观察者设计模式(监听设计模式),该模式在很多主流得框架、源码中使用率非常高。在分享之前先给大家讲一个我们使用手机的一个场景,我们都用过手机,当我们手机来电话的时候,会有各种复杂的操作,比如会响铃、手机震动、屏幕会亮屏等等,大家有没有考虑过这个场景是怎么实现的呢?其实这个地方就是使用了观察者设计模式。

在上述例子中,如果不使用观察者设计模式,要怎么设计比较合理,任何一种设计模式的出现都有它使用的场景,这都是历经多少前辈的经验总结出来的,观察者设计模式也不例外

观察者模式的应用场景: 1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。 2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

定义

观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或 从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各 观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

UML图

观察者设计模式主要包括以下三个部分:

1,事件

2,事件源

3,观察者(监听者)

上述的例子中,事件(来电);事件源(call);观察者(屏幕相应对象、响铃相应对象、震动相应对象等),这些观察者就是订阅了call的状态,当call的状态变成来电时,这些观察者就能收到相应的信息,然后做一些更新的操作。

代码设计

CallObserverable.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mode.observe;

/**
 * @author hongtaolong
 * 抽象的被观察的接口
 */
public interface CallObserverable {
	public void registerObserver(CallStateListener o);//订阅
    public void removeObserver(CallStateListener o);//删除订阅
    public void notifyObserver();//通知
}

CallStateListener.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mode.observe;

/**
 * @author hongtaolong
 * call状态监听的接口
 */
public interface CallStateListener {

	void update();
}

CallRing.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mode.observe;

/**
 * @author hongtaolong
 * 响铃相关的类
 */
public class CallRing implements CallStateListener {

	@Override
	public void update() {
		// TODO Auto-generated method stub
		System.out.println("来电话了,我要响铃了");
	}

}

CallScreen.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mode.observe;

/**
 * @author hongtaolong
 * 响铃相关的类
 */
public class CallScreen implements CallStateListener {

	@Override
	public void update() {
		// TODO Auto-generated method stub
		System.out.println("来电话了,我要亮屏");
	}

}

CallShock.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mode.observe;

/**
 * @author hongtaolong
 * 震动相关的类
 */
public class CallShock implements CallStateListener {

	@Override
	public void update() {
		// TODO Auto-generated method stub
		System.out.println("来电话了,我要震动了");
	}

}

CallState.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mode.observe;

import java.util.ArrayList;
import java.util.List;

/**
 * @author hongtaolong
 * call状态类
 */
public class CallState implements CallObserverable{

	private int state;//call的状态
	private List<CallStateListener> mCallListeners;
	
	public CallState() {
		// TODO Auto-generated constructor stub
		mCallListeners = new ArrayList<>();
	}
	public int getState() {
		return state;
	}
	public void setState(int state) {
		this.state = state;
		//为了方便在这里进行简单的改变call的状态,设定当state = 2表示来电话
		if(state == 2) {
			notifyObserver();//通知观察者
		}
	}
	@Override
	public void registerObserver(CallStateListener o) {
		// TODO Auto-generated method stub
		mCallListeners.add(o);
		
	}
	@Override
	public void removeObserver(CallStateListener o) {
		// TODO Auto-generated method stub
		mCallListeners.remove(o);
	}
	@Override
	public void notifyObserver() {
		// TODO Auto-generated method stub
		for(CallStateListener listener : mCallListeners) {
			listener.update();
		}
	}
	
	
}

CallClient.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mode.observe;

/**
 * @author hongtaolong
 * 客户端
 */
public class CallClient {

	public static void main(String[] args) {
		CallStateListener shock = new CallShock();
		CallStateListener screen = new CallScreen();
		CallStateListener ring = new CallRing();
		CallState callState = new CallState();
		callState.registerObserver(screen);//screen订阅call的状态
		callState.registerObserver(shock);//shock订阅call状态
		callState.registerObserver(ring);//ring订阅call状态
		callState.setState(2);//模拟2表示来电
	}
}

运行结果:

观察者设计模式是不是非常简单,本文如有错误之处,欢迎指出,谢谢!

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
AI智能体(AI Agent): 概念、技术、趋势及其在制造业中的应用
今天分享Google DeepResearch对AI  Agent的研究分析报告。
人月聊IT
2025/06/24
1020
AI智能体(AI Agent): 概念、技术、趋势及其在制造业中的应用
深入解析MCP:从微软认证到AI协议的双重维度
在技术领域,缩略词“MCP”因其在不同场景下的多重含义而常引发混淆。本文将从两个核心维度——微软认证产品专家(Microsoft Certified Professional)与模型上下文协议(Model Context Protocol)——深度解析MCP的定义、价值与应用场景,助您全面理解这一技术热词背后的双重内涵。
是山河呀
2025/06/21
820
Agentic AI及其设计模式简介
微软推出 AI 代理,加深与 Salesforce 的竞争;这家总部位于华盛顿州雷德蒙德的软件制造商,周一表示,将推出 10 个自治agent,代表销售、客户支持和会计等领域的人员完成任务。
AIGC新知
2024/12/25
4530
Agentic AI及其设计模式简介
吴恩达评Agent现状:MCP尚处“蛮荒”,单Agent跑通已是“奇迹”,A2A协作堪称“双重奇迹”
吴恩达评Agent现状:MCP尚处“蛮荒”,单Agent跑通已是“奇迹”,A2A协作堪称“双重奇迹”,InfoQ,8分钟
深度学习与Python
2025/06/08
870
吴恩达评Agent现状:MCP尚处“蛮荒”,单Agent跑通已是“奇迹”,A2A协作堪称“双重奇迹”
一文看懂科技巨头 AI 战略布局
【新智元导读】科技巨头纷纷投入 AI,谁将在这场军备竞赛中胜出?本文介绍谷歌等主要几家巨头公司的AI布局。不过,无论谁最后胜出,消费者都将受益。 人工智能正在迅速成为科技领域最流行的话题之一,科技巨头们也毫不忽视这一趋势。所有的大公司似乎都在以某种方式投资机器学习。 谁将在这场AI军备竞赛中胜出?现在得出定论还太早,但对消费者来说,无论谁胜出消费者都将受益。AI在日常服务以及产品中的渗透只会提升终端用户的体验。 市场研究公司IDC预测,到2020年,AI的市场规模将从今年的80亿美元增长到470亿美元。本文
新智元
2018/03/26
9210
一文看懂科技巨头 AI 战略布局
AI代理入侵可观测性:蛇油还是SRE的未来?
Mooster 和朋友们希望加入您的运维团队:了解生成式 AI 代理与可观测性和监控软件相遇时会发生什么。
云云众生s
2024/09/20
960
AI代理入侵可观测性:蛇油还是SRE的未来?
日常评 | WAIC见闻与思考:AI应用落地热潮将至 深度学习的冬天要来?
8月29日-8月31日,2019第二届世界人工智能大会(WAIC)在上海召开,有幸能够近距离接触此次盛会,众多名家云集,深感看到的学到的东西很多,也深知自己的水平与各位高手望尘莫及,有很多需要努力的地方要紧跟脚步。
ZNing
2020/05/13
5600
日常评 | WAIC见闻与思考:AI应用落地热潮将至 深度学习的冬天要来?
【科普篇】LLM、GPT、AIGC、AI Agent、Agentic AI 到底是个啥?
2024 年可谓是AI 大模型全面开花的一年,各大厂纷纷发布了自己的大模型应用产品,比如:
巫山老妖
2025/06/16
2430
【科普篇】LLM、GPT、AIGC、AI Agent、Agentic AI 到底是个啥?
Salesforce报告:IT部门成功的关键因素
Salesforce在4月26号刚刚发布的IT报告中谈到:云计算以及其他技术的进步已经将IT在企中的角色从成本中心转化到价值中心。
臭豆腐
2019/04/16
5320
Salesforce的前世今生
1999年,正是互联网泡沫膨胀到最高峰的一年。这一年Marc Benioff才27岁,却已经是Oracle的高级副总裁,当然也是Oracle历史上最年轻的高级副总裁。可能在很多人看来,在如此年纪取得这样的成绩已经非常不错了,但就在这一年他却离开Oracle开启了“苦逼”的创业之旅,创办了Salesforce——一家客户关系管理(CRM)软件服务提供商。 要知道当时还有一家如日中天的CRM公司,那就是创办于1993年Siebel。在Salesforce成立一年后的2000年,有一天软件服务商Siebel正在举
人称T客
2018/06/06
1.2K0
Agentic AI是新的Web应用程序,您的AI策略必须发展
在生成式 AI 革命两年后,为 ChatGPT 和 Claude 等工具提供支持的 LLM 变得异常强大。然而,根据 Salesforce 首席执行官 Marc Benioff 的说法,它们可能正在达到极限。根据 Benioff 的说法,下一个进化不一定是更智能的 LLM,而是利用 LLM 独立执行任务的自主 AI 代理。
云云众生s
2025/03/06
870
IBM联合Salesforce 要搞死微软占领AI
T客汇官网:tikehui.com 撰文 张珅健 IBM、Salesforce宣布要强强联合,推出Salesforce的Einstein平台,将微软赶出IBM,占领AI市场。 据悉,随着合作的进行,
人称T客
2018/03/23
9690
IBM联合Salesforce 要搞死微软占领AI
Salesforce 用机器学习来自动总结文本,AI+SaaS 是未来吗?
  如今我们身处海量信息时代,大量时间被用来处理电子邮件、文章或社交媒体的帖子等信息,有预计称,这种消耗状态会超过半天时间,甚至更多。
臭豆腐
2019/04/16
6710
AI代理:开发者全面入门指南
为了帮助开发者理解和使用 AI 代理,我们在代理类似于员工的数字孪生兄弟的前提下对其进行了映射。
云云众生s
2024/10/23
3310
AI代理:开发者全面入门指南
Agent 时代的 HTTP 来了?谷歌 A2A 开源协议打破企业间 Agent 壁垒,OpenAI 系缺席标准之战
谷歌今日推出了一种名为 Agent2Agent(简称 A2A)的新型互操作协议,或将成为人工智能智能体从孤立系统迈向开放协作生态的重要信号。
深度学习与Python
2025/04/13
3240
Agent 时代的 HTTP 来了?谷歌 A2A 开源协议打破企业间 Agent 壁垒,OpenAI 系缺席标准之战
Agentic AI 要终结数据库和 SaaS?大厂掌门人公开互撕,焦虑的 CEO 们押上了不同的技术路线
无论是大模型厂商、AI 初创公司,还是企业级应用团队,几乎都在讨论“多智能体协作”“自动化决策流程”以及“具备工具调用能力的 AI 系统”。
深度学习与Python
2025/05/13
1450
Agentic AI 要终结数据库和 SaaS?大厂掌门人公开互撕,焦虑的 CEO 们押上了不同的技术路线
2017 Dreamforce大会中了解到的Salesforce Einstein进化与发展
美国银行已经部署了Salesforce Einstein功能,包括Predictive Lead Scoring和Einstein Analytics(之前的Wave),用于客户流失分析和保留。此外它还采用了Einstein Discovery(之前的BeyondCore),以更好地了解客户行为和交叉销售机会。该银行预计将把Einstein推广给全公司2000名面向客户的财务顾问,希望能够“大规模提供个性化服务”以及“创造具有差异化的客户体验”,Hoffman表示。
臭豆腐
2019/04/16
8460
2017 Dreamforce大会中了解到的Salesforce Einstein进化与发展
95后打造世界首个行动型浏览器——Fellou,从「浏览」到「行动」一键直达!
得益于自由开放的Web,浏览器成为我们探索数字世界的核心入口,社交、娱乐、信息获取、生产力,它几乎可以承载我们全部的数字生活。
新智元
2025/04/22
5120
95后打造世界首个行动型浏览器——Fellou,从「浏览」到「行动」一键直达!
白宫成立人工智能特别委员会 ,英特尔CEO:AI应成为美国的国家战略
---- 新智元报道 编辑:克雷格 【新智元导读】白宫举办的美国工业人工智能峰会周四结束,谷歌、亚马逊、英特尔等近40家科技巨头参加,会上还宣布成立人工智能特别委员会,以改善联邦政府在人工智能领域的投入。自特朗普上台后,硅谷与白宫的关系一直冷淡,这次是个改善的信号吗? Make AI Great Again? 本周四,美国白宫举办了一场“美国工业人工智能峰会”( “Artificial Intelligence for American Industry” summit),邀请近40家科技企业参会。
新智元
2018/05/29
7410
详解Salesforce拳头产品 Einstein ,AI正描绘未来?
十年前,Twitter 和 Facebook 一样,是最为被外界看好的两种社交形态,原本以为这两个巨头会一路相爱相杀直到永远,谁能想到,十年后的 Facebook 依然这么活跃,各种广告业务也如火如荼,而它的好基友 Twitter ,却落得没人要的境地……
臭豆腐
2019/04/16
1.5K0
详解Salesforce拳头产品 Einstein ,AI正描绘未来?
推荐阅读
相关推荐
AI智能体(AI Agent): 概念、技术、趋势及其在制造业中的应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档