首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
虚拟化.超融合.云计算
›
公有云
›
SAAS
›
《C# .net软件筹划模式-----观察者模式》
返回列表
发新帖
《C# .net软件筹划模式-----观察者模式》
[复制链接]
发表于 2026-2-9 14:51:15
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
观察者模式(Observer Pattern)是一种软件筹划模式,属于对象活动模式的一种。它界说了一种一对多的依靠关系,使得多个观察者对象可以同时监听某个主题对象(也称被观察者)。当主题对象的状态发生改变时,会主动关照全部注册的观察者,让它们可以或许主动更新自身状态。
这种模式的焦点在于解耦:主题对象无需知道具体有哪些观察者,只需维护一个观察者列表并在状态厘革时关照它们;而观察者也只需关注本身感爱好的变乱,无需主动轮询主题状态。
观察者模式在软件架构中被广泛应用,尤其实用于变乱处理惩罚体系、用户界面与业务数据的同步、权限管理等场景。比方,在图形界面中,界面元素(观察者)可以监听配景数据模子(主题)的厘革,一旦数据更新,界面主动革新。
重要脚色
主题(Subject):也称为被观察者,它是一个具体的对象,通过attach()方法注册观察者,通过notifyObservers()方法关照观察者。
观察者(Observer):也称为观察者,它界说了一个更新接口,当主题状态改变时,得到关照并举行相应的处理惩罚。
具体主题(ConcreteSubject):是主题的具体实现对象,它生存着观察者对象的列表,并实现了抽象主题中的方法。
具体观察者(ConcreteObserver):是观察者的具体实现对象,它存储着具体主题的引用,实现了抽象观察者中的更新接口。
推模式与拉模式
在关照机制上,观察者模式通常分为两种实现方式:
推模式(Push):主题对象将状态数据主动推送给观察者,观察者无需额外获取。
拉模式(Pull):主题仅发送关照,观察者主动拉取所需数据,通常通过主题对象的引用获取最新状态。
观察者模式也常被称为发布-订阅模式(Publish/Subscribe)、模子-视图模式(Model/View)或源-监听器模式(Source/Listener)。
应用场景
观察者模式通常用于以了局景:
变乱处理惩罚:观察者模式可以用于变乱处理惩罚体系,在体系中,变乱源对象可以将变乱关照全部的观察者对象,以便观察者对象可以实行相应的利用。
状态监控:观察者模式可以用于监控对象的状态厘革,在状态改变时,关照全部观察者对象。
MVC模式:MVC模式中,视图与数据模子是分离的,视图通常是数据模子的观察者。当数据模子发生厘革时,关照全部的视图对象,更新视图。
消息体系:观察者模式可以用于实现消息体系,在体系中,消息发布者可以将消息关照全部的观察者对象,以便观察者对象可以实行相应的利用。
GUI开发:观察者模式可以用于GUI开发,在GUI中,图形对象可以作为观察者,与数据模子对象创建关联,当数据模子发生厘革时,关照全部的观察者对象,更新界面。
优缺点
观察者模式是一种活动型筹划模式,界说了一种一对多的依靠关系,当一个对象的状态发生改变时,它的全部依靠者都会收到关照并主动更新状态。
优点包罗:
松耦合:观察者模式实现了对象之间的松耦合,被观察者和观察者之间的关系被解耦,它们都可以独立地厘革。
对象的状态更新:观察者模式实现了对象的状态更新,当对象的状态发生厘革时,全部依靠它的对象都会收到关照并主动更新状态。
拓展性:在观察者模式中,可以很方便地增长或删除观察者,实现拓展性。
缺点包罗:
观察者模式大概导致变乱的洪泛,即被观察者的状态厘革导致大量的信息转达和处理惩罚,这大概低沉步调的性能。
大概存在循环依靠题目:当观察者和被观察者之间存在相互依靠时,就会出现循环依靠的题目,这会导致体系的稳固性低沉。
观察者模式须要思量开发服从和运行服从两个方面,开发服从较高,但须要思量怎样优化运行服从。
模式实现
委托方式实现
using System;
// 定义委托
public delegate void NotifyEventHandler(string message);
// 主题类
public class Subject
{
public event NotifyEventHandler NotifyEvent; // 声明事件
public void ChangeState()
{
Console.WriteLine("Subject: 我的状态改变了!");
NotifyEvent?.Invoke("状态已改变"); // 触发事件
}
}
// 观察者类
public class Observer
{
public void OnNotify(string message)
{
Console.WriteLine($"Observer: 收到通知 - {message}");
}
}
// 使用示例
class Program
{
static void Main()
{
Subject subject = new Subject();
Observer observer = new Observer();
// 订阅事件
subject.NotifyEvent += observer.OnNotify;
// 触发状态改变
subject.ChangeState();
// 取消订阅
subject.NotifyEvent -= observer.OnNotify;
}
}
复制代码
接口方式实现
using System;
using System.Collections.Generic;
// 观察者接口
public interface IObserver
{
void Update(string message);
}
// 主题接口
public interface ISubject
{
void Attach(IObserver observer);
void Detach(IObserver observer);
void Notify(string message);
}
// 具体主题类
public class NewsSubject : ISubject
{
private readonly List<IObserver> _observers = new List<IObserver>();
public void Attach(IObserver observer)
{
_observers.Add(observer);
}
public void Detach(IObserver observer)
{
_observers.Remove(observer);
}
public void Notify(string message)
{
foreach (var observer in _observers)
{
observer.Update(message);
}
}
}
// 具体观察者类
public class UserObserver : IObserver
{
private readonly string _userName;
public UserObserver(string name)
{
_userName = name;
}
public void Update(string message)
{
Console.WriteLine($"{_userName} 收到消息: {message}");
}
}
// 测试类
public class Program
{
public static void Main()
{
// 创建主题
ISubject news = new NewsSubject();
// 创建观察者
IObserver user1 = new UserObserver("张三");
IObserver user2 = new UserObserver("李四");
// 注册观察者
news.Attach(user1);
news.Attach(user2);
// 通知观察者
news.Notify("最新新闻:C#观察者模式实现成功!");
// 移除一个观察者
news.Detach(user1);
// 再次通知
news.Notify("更新新闻:张三已退订。");
}
}
复制代码
回复
使用道具
举报
返回列表
浏览过的版块
人工智能
分布式数据库
linux
SQL-Server
数据仓库与分析
DevOps与敏捷开发
程序人生
物联网
Java
自由的羽毛
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表