C#观察者模式:牛顿成绩案例详解与代码
PDF格式 | 90KB |
更新于2024-09-01
| 33 浏览量 | 举报
在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#的观察者模式,我们可以实现一个灵活且易于扩展的系统,当牛顿童鞋的成绩发生变化时,无需修改已有的代码,只需要添加或修改观察者即可。这样的设计提高了代码的可复用性和可维护性,是面向对象编程中的一个重要设计原则。
相关推荐
![filetype](https://img-home.csdnimg.cn/images/20241231044930.png)
![filetype](https://img-home.csdnimg.cn/images/20241231044930.png)
![filetype](https://img-home.csdnimg.cn/images/20241231044937.png)
![filetype](https://img-home.csdnimg.cn/images/20241231044955.png)
![filetype](https://img-home.csdnimg.cn/images/20241231044955.png)
![filetype](https://img-home.csdnimg.cn/images/20210720083606.png)
![filetype](https://img-home.csdnimg.cn/images/20241231044930.png)
![filetype](https://img-home.csdnimg.cn/images/20241231044955.png)
![filetype](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
weixin_38742647
- 粉丝: 25
最新资源
- Eclipse IDE基础教程:从入门到精通
- 飞思卡尔Microcontroller开发:Codewarrior IDE详解
- 红旗Linux 6.0桌面版:全面升级与特性概览
- ActionScript 3.0 游戏编程深度解析
- OpenCms中文用户手册:入门与实践指南
- 互联网协议与服务解析:SOAP、IPv6、HTTPS、HAILSTORM与Bluetooth
- .NET框架中的C#:快速开发与强大功能
- C#程序设计基础:数据类型与引用类型解析
- C语言深度解析:指针概念与应用实例
- Linux系统下的C编程实践与编辑器vi使用指南
- 电脑组装DIY基础指南:从硬件到配置选择
- 使用Hibernate连接Oracle数据库配置详解
- 构建面向服务的架构:ServiceMix实战
- Linux常用命令速览与详解
- C#编程入门教程:从零开始学习
- MD5算法详解:从MD2到不安全的MD4