C#观察者模式:牛顿成绩案例详解与代码
PDF格式 | 90KB |
更新于2024-09-01
| 75 浏览量 | 举报
在C#编程中,观察者模式是一种常用的软件设计模式,它允许对象之间建立一种松散耦合的关系,当一个对象(被观察者)的状态发生变化时,所有依赖于它的对象(观察者)都能得到通知并相应地更新它们的行为。本文将以解决牛顿童鞋的成绩问题为例,详细介绍这一模式的应用。
首先,观察者模式的基本理论定义如下:它描述了一个对象的变更会影响多个其他对象,这些对象作为观察者,会在变更发生时自动获取通知并执行适当的响应。这有助于实现模块间的解耦,提高系统的可维护性和扩展性。
在实际场景中,我们设想牛顿同学的期末考试成绩公布后,多个角色需要关注他的成绩:语文老师、英语老师、数学老师以及班主任。每个角色对成绩的关注点不同,但他们都通过观察者模式来获取最新的成绩信息。
为了实现这个功能,我们需要创建以下几个关键类:
1. 学生信息类 (Student):这是基础实体,包含学生的姓名属性。
```csharp
public class Student
{
public string Name { get; set; }
}
```
2. 成绩类 (Score):这是一个抽象类,用于封装成绩信息,并定义通知事件处理方法。
```csharp
public delegate void NotifyEventHandler(Score score);
public abstract class Score
{
public event NotifyEventHandler Notify;
protected virtual void OnNotify(Score score)
{
Notify?.Invoke(this, score);
}
// 其他属性和方法,如成绩详情
}
```
3. 具体科目成绩类 (例如:SubjectScore),作为观察者,每个科目都有自己的分数和通知事件处理。
```csharp
public class ChineseScore : SubjectScore
{
public int Chinese { get; set; }
public override void NotifyScore(Score score) => Console.WriteLine($"语文成绩:{Chinese}");
}
// 类似地,为英语和数学创建对应的SubjectScore子类
```
4. 班主任关注的总成绩类 (TeacherTeacherHead):作为一个综合观察者,关心学生的整体成绩。
```csharp
public class TeacherTeacherHead : SubjectScore
{
public ChineseScore Chinese { get; set; }
public EnglishScore English { get; set; }
public MathematicsScore Mathematics { get; set; }
public override void NotifyScore(Score score)
{
// 计算并显示总成绩
int totalScore = Chinese.Chinese + English.English + Mathematics.Mathematics;
Console.WriteLine($"班主任关注:牛顿总成绩:{totalScore}");
}
}
```
最后,当牛顿童鞋的成绩发布时,只需在成绩类中触发`Notify`事件,所有订阅者(各科老师和班主任)就会收到通知并更新他们的信息。
通过C#的观察者模式,我们可以实现一个灵活且易于扩展的系统,当牛顿童鞋的成绩发生变化时,无需修改已有的代码,只需要添加或修改观察者即可。这样的设计提高了代码的可复用性和可维护性,是面向对象编程中的一个重要设计原则。
相关推荐










weixin_38742647
- 粉丝: 25
最新资源
- ASP.NET集成支付宝即时到账支付流程详解
- C++递推法在解决三道经典算法问题中的应用
- Qt_MARCHING_CUBES算法在面绘制中的应用
- 传感器原理与应用课程习题解答指南
- 乐高FLL2017-2018任务挑战解析:饮水思源
- Jquery Ui婚礼祝福特效:经典30款小型设计
- 紧急定位伴侣:蓝光文字的位置追踪功能
- MATLAB神经网络实用案例分析大全
- Masm611: 安全高效的汇编语言调试工具
- 3DCurator:彩色木雕CT数据的3D可视化解决方案
- 聊天留言网站开发项目全套资源下载
- 触摸屏适用的左右循环拖动展示技术
- 新型不连续导电模式V_2控制Buck变换器研究分析
- 用户自定义JavaScript脚本集合分享
- 易语言实现非主流方式获取网关IP源码教程
- 微信跳一跳小程序前端源码解析