委托实现C#观察者模式简单例子
在C#编程中,观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在这个例子中,我们将通过使用委托来实现这一模式。委托在C#中扮演着函数指针的角色,可以将方法作为参数传递,使得在运行时可以调用不同的方法。 我们来理解观察者模式的核心概念: 1. **主题(Subject)**:这是被观察的对象,它维护一个观察者列表,并提供添加、删除观察者的方法以及通知所有观察者状态变化的机制。 2. **观察者(Observer)**:是关注主题的对象,当主题状态改变时,会被通知并执行相应的操作。 3. **事件(Event)**:在C#中,事件是基于委托的特殊类型,用于在类之间安全地发布通知。 4. **委托(Delegate)**:是C#中的多播委托,它可以引用多个方法,相当于事件处理程序的列表。 现在,让我们逐步构建这个简单的C#观察者模式实例: 1. **定义委托** 我们需要定义一个委托类型,表示观察者应该执行的操作。例如: ```csharp public delegate void StateChangedEventHandler(object sender, EventArgs e); ``` 这里的`StateChangedEventHandler`是一个事件处理器,它接受两个参数:`sender`(触发事件的对象)和`EventArgs`(通常用于传递额外的信息)。 2. **创建主题类(Subject)** 主题类需要存储观察者的列表,并提供订阅和退订事件的方法。例如: ```csharp public class Subject { private List<Observer> observers = new List<Observer>(); public event StateChangedEventHandler StateChanged; public void Attach(Observer observer) { observers.Add(observer); } public void Detach(Observer observer) { observers.Remove(observer); } protected virtual void OnStateChanged(EventArgs e) { StateChanged?.Invoke(this, e); } // 其他操作,比如改变状态 public void ChangeState() { // ...改变状态的逻辑... OnStateChanged(EventArgs.Empty); } } ``` `Attach`和`Detach`方法分别用于添加和移除观察者,`OnStateChanged`是触发事件的方法,使用`?.`操作符防止在没有订阅者时抛出异常。 3. **创建观察者类(Observer)** 观察者需要实现对主题状态变化的响应。这里我们可以创建一个接口`IObserver`,然后创建一个具体的观察者类实现这个接口: ```csharp public interface IObserver { void Update(); } public class ConcreteObserver : IObserver { public void Update() { Console.WriteLine("状态已更新,执行相应操作..."); } } ``` 在`ConcreteObserver`类中,我们定义了一个`Update`方法,当状态改变时会被调用。 4. **订阅和触发事件** 在主程序中,我们可以创建一个`Subject`实例,添加一个或多个`ConcreteObserver`实例作为观察者,然后改变主题的状态来触发事件: ```csharp static void Main(string[] args) { Subject subject = new Subject(); Observer observer1 = new ConcreteObserver(); subject.Attach(observer1); subject.ChangeState(); // 触发状态改变,从而调用所有观察者的Update方法 } ``` 通过这个简单的例子,我们展示了如何使用C#的委托来实现观察者模式。这个模式在多处有应用,如UI控件的事件处理、数据绑定等。理解并熟练运用观察者模式有助于构建可扩展、解耦的系统。
- 1
- lancecase2015-06-29随便下个东西试试看,网通下不了好像.
- 粉丝: 452
- 资源: 40
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助