设计模式_观察者模式

news/2025/1/15 22:38:54/

观察者模式

介绍

设计模式定义案例问题堆积在哪里解决办法
观察者是行为型设计模式
多个对象 观察 1个对象
小强考试完 成绩公布了
家长/同学得知成绩后
做出不同反应
一个一个通知很麻烦
先通知谁 也有讲究的

信息发布方
抽象出一个信息管理类
负责管理监听者

类图

代码

ObserverBase


public abstract class ObserverBase
{public abstract void ReceiverMsg();
}

Mom 

using UnityEngine;public class Mom : ObserverBase
{public void MakeDinner(){Debug.Log("mom:做一顿大餐!");}public override void ReceiverMsg(){MakeDinner();}
}

Father 

using UnityEngine;public class Father : ObserverBase
{public void BuyToys(){Debug.Log("father:买玩具!");}public override void ReceiverMsg(){BuyToys();}
}

Schoolmate 

using UnityEngine;public class Schoolmate : ObserverBase
{public void Good(){Debug.Log("同学:给你鼓掌 嗷嗷叫!!");}public override void ReceiverMsg(){Good();}
}

Myself

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Myself
{// 观察者列表public List<ObserverBase> observerList = new List<ObserverBase>();// 添加观察者public void Add(ObserverBase observer){observerList.Add(observer);}// 移除观察者public void Remove(ObserverBase observer){observerList.Remove(observer);}public void Clear(){observerList.Clear();}// Show分数public void ShowGrade(){Debug.Log("公开考试成绩:100" );// 通知注册的人foreach (var item in observerList){item.ReceiverMsg();}}}

测试代码

public class TestGCZ : MonoBehaviour
{void Start(){Myself myself = new Myself();myself.Add(new Schoolmate());myself.Add(new Father());myself.Add(new Mom());myself.ShowGrade();}}

结果

总结

这个例子比较简单一个对象发生变化 通知 一群观察者

如果需求更复杂 (一群对象是观察者也是被观察者,相互直接观察然后做出不同的反应)

这样对更有趣! 

如:

一个对象如果希望交流 , 就变为“交流者”,

“交流者”具备 观察者和发布者的功能。


http://www.ppmy.cn/news/1189218.html

相关文章

UNVEILING A CORE LINGUISTIC REGION IN LARGE LANGUAGE MODELS

本文是LLM系列文章&#xff0c;针对《UNVEILING A CORE LINGUISTIC REGION IN LARGE LANGUAGE MODELS》的翻译。 揭示大型语言模型中的核心语言区域 摘要1 引言2 前言和背景3 核心语言能力区4 讨论和未来工作5 结论 摘要 大脑定位描述了大脑特定区域与其相应功能之间的联系&a…

Web 页面导出表数据到文件由后台实现还是前端实现?

文章目录 1.前端实现2.后台实现3.小结参考文献 Web 页面导出表数据到 Excel&#xff08;或其他格式&#xff09;可以由前端或后台来实现&#xff0c;具体的实现方式取决于你的应用需求和架构。以下是一些考虑因素&#xff1a; 1.前端实现 如果你的数据导出不涉及复杂的数据处理…

ajax超时,修改timeout

import Axios from axios import { Message, Spin } from view-design import i18n from ./../locale import qs from qs // import { getUser } from /libs/utilconst conf {headers: {Content-Type: application/json; charsetutf-8},// 连接时间40秒timeout: 40000,baseURL…

VINS-Mono-VIO初始化 (五:视觉惯性对齐求解)

整体思想就是根据预积分的公式&#xff0c;把已知量和未知量各放到一边&#xff0c;因为前面的数据都是变换到 c 0 c_{0} c0​下的&#xff0c;不是真正意义上和重力对齐的世界坐标&#xff0c;然后位移和速度的预积分中会用到加速度计获取的重力加速度g&#xff0c;但是这个重…

git diff对比差异时指定或排除特定的文件和目录

文章目录 前言git diff指定或者排除文件指定文件和目录排除文件和目录 番外篇总结 前言 你一般什么时候会用GPT? 居然会有这种话题&#xff0c;答案就是作为程序员的我天天在用&#xff0c;虽然GPT有个胡说八道的毛病&#xff0c;但试试总没错的&#xff0c;就比如今天题目中这…

【设计模式】第22节:行为型模式之“状态模式”

一、简介 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工作流引擎等系统开发中。不过&#xff0c;状态机的实现方式有多种&#xff0c;除了状态模式&#xff0c;比较常用的还有分支逻辑法和查表法。该模式允许对象内部状态改变使改变它的行为。 二、适用场景…

数据结构(超详细讲解!!)第十八节 串(KMP算法)

1.BF算法 算法在字符比较不相等&#xff0c;需要回溯&#xff08;即ii-j1&#xff09;&#xff1a;即退到s中的下一个字符开始进行继续匹配。 最好情况下的时间复杂度为O(m)。 最坏情况下的时间复杂度为O(nm)。 平均的时间复杂度为O(nm)。 2.KMP算法 KMP算法是D.E.Knuth、…

分享一下微信小程序抽奖链接怎么做

标题&#xff1a;微信小程序抽奖链接制作全攻略&#xff0c;轻松玩转营销抽奖活动 一、引言 在当今的数字化时代&#xff0c;抽奖活动已经成为一种高效的市场营销策略&#xff0c;而微信小程序作为一个功能强大的移动端平台&#xff0c;为企业和个人提供了制作抽奖链接的便捷…