观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许对象在状态改变时通知其他依赖该对象的对象。在C#中,观察者模式主要通过事件(Event)和委托(Delegate)机制来实现,这使得对象之间的耦合度降低,提高了代码的可维护性和可扩展性。
我们要理解C#中的事件和委托。委托是C#中的一个类型,它代表方法的引用,可以看作是事件的“信使”。事件则是对象的私有委托实例,用于保护发布者免受不适当的订阅者干扰。C#中的事件模型遵循发布/订阅模式,即发布者(Subject)定义事件,订阅者(Observer)通过订阅事件来接收通知。
在“猫大叫鼠逃跑主人醒”的场景中,我们可以将这个过程抽象为三个角色:猫(Cat)作为主题,鼠(Mouse)作为观察者,而主人(Owner)则是一个间接观察者,通过鼠来感知猫的行为变化。以下是具体实现:
1. 定义`ICatObserver`接口,表示观察猫的行为:
```csharp
public interface ICatObserver
{
void OnCatCries();
}
```
2. 创建`Cat`类,作为被观察者,包含一个`CatCries`事件:
```csharp
public class Cat
{
public event EventHandler CatCries;
public void Cry()
{
CatCries?.Invoke(this, EventArgs.Empty);
}
}
```
3. 实现`Mouse`类,作为直接观察者,订阅`Cat`的`CatCries`事件并做出反应:
```csharp
public class Mouse : ICatObserver
{
public void Subscribe(Cat cat)
{
cat.CatCries += Mouse_CatCries;
}
private void Mouse_CatCries(object sender, EventArgs e)
{
Console.WriteLine("鼠听到猫叫声,开始逃跑");
}
}
```
4. 创建`Owner`类,通过`Mouse`来间接观察`Cat`:
```csharp
public class Owner
{
private Mouse _mouse;
public Owner(Mouse mouse)
{
_mouse = mouse;
}
public void Sleep()
{
Console.WriteLine("主人正在睡觉");
}
public void WakeUp()
{
Console.WriteLine("主人醒来");
}
}
```
5. 主程序中,初始化对象并建立关系:
```csharp
public static void Main(string[] args)
{
var cat = new Cat();
var mouse = new Mouse();
var owner = new Owner(mouse);
mouse.Subscribe(cat);
cat.Cry(); // 触发猫的事件,模拟猫叫
}
```
在这个例子中,当`Cat`类的`Cry`方法被调用时,它会触发`CatCries`事件,`Mouse`作为订阅者接收到通知后执行相应的操作,即“鼠开始逃跑”。同时,因为鼠的异常行为,`Owner`也会通过`Mouse`间接接收到猫的事件,从而执行“主人醒来”。
观察者模式在实际开发中应用广泛,如UI控件间的交互、数据绑定等,通过解耦发布者和订阅者,使得系统更易于维护和扩展。在C#中,事件和委托的结合让观察者模式的实现更为简洁高效。