C#观察者模式:牛顿成绩案例详解与代码

0 下载量 143 浏览量 更新于2024-09-01 收藏 90KB PDF 举报
在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#的观察者模式,我们可以实现一个灵活且易于扩展的系统,当牛顿童鞋的成绩发生变化时,无需修改已有的代码,只需要添加或修改观察者即可。这样的设计提高了代码的可复用性和可维护性,是面向对象编程中的一个重要设计原则。