观察者模式 | C#实现

什么是观察者模式?

观察者模式(Observer Pattern)又被称为发布-订阅(Publish/Subscribe)模式。

该模式描述了对象间一对多的依赖关系,当一个对象状态发生改变时,其依赖对象都会得到通知并自动更新。

发生改变的对象为观察目标,被通知并自行更新的对象为观察者。

为什么使用观察者模式?

为了将观察目标与观察者解耦。

当使用观察者模式后,观察者只需要知道观察目标发生了改变,而不需要知道究竟发生了什么改变;同理,观察目标只需要发出通知,让所有观察者自行做出响应。

游戏中的事件系统就很适合用此设计模式。

观察者模式的实现(C#)

  • Observer:观察者接口
	/// <summary>
	/// 观察者接口
	/// </summary>
	public interface Observer
	{
		void OnNotify();
	}
  • Subject:观察目标抽象类
	/// <summary>
	/// 观察目标抽象类
	/// </summary>
	public abstract class Subject
	{
		// 观察者列表
		protected List<Observer> observers;
		// 添加观察者
		public abstract void Add(Observer observer);
		// 删除观察者
		public abstract void Remove(Observer observer);
		// 通知所有观察者
		public abstract void NotifyAllObservers();
	}
  • ConcreteSubject:观察目标具体实现
	/// <summary>
	/// 观察目标具体实现
	/// </summary>
	public class ConcreteSubject : Subject
	{
		public ConcreteSubject()
		{
			observers = new List<Observer>();
		}
		public override void Add(Observer observer)
		{
			if (!observers.Contains(observer))
			{
				observers.Add(observer);
			}
		}

		public override void Remove(Observer observer)
		{
			if (observers.Contains(observer))
			{
				observers.Remove(observer);
			}
		}

		public override void NotifyAllObservers()
		{
			foreach (Observer o in observers)
			{
				o.OnNotify();
			}
		}
	}
  • ConcreteObserver:观察者实现,一个观察对象可以对应多个观察者
	/// <summary>
	/// 观察者实例1
	/// </summary>
	public class ConcreteObserver1 : Observer
	{
		public void OnNotify()
		{
			Console.WriteLine("OnNotify ConcreteObserver1");
		}
	}

	/// <summary>
	/// 观察者实例2
	/// </summary>
	public class ConcreteObserver2 : Observer
	{
		public void OnNotify()
		{
			Console.WriteLine("OnNotify ConcreteObserver2");
		}
	}

测试代码

public class Test
	{
		public static void TestFunc()
		{
			// 实例化观察目标
			Subject subject = new ConcreteSubject();

			//实例化观察者
			Observer observer1 = new ConcreteObserver1();
			Observer observer2 = new ConcreteObserver2();

			//向观察目标的观察者列表中添加对象
			subject.Add(observer1);
			subject.Add(observer2);

			//通知全体观察者
			subject.NotifyAllObservers();
		}
	}

输出:

	OnNotify ConcreteObserver1
	OnNotify ConcreteObserver2
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
观察者模式是一种常见的设计模式,它可以实现对象之间的解耦,使得一个对象的状态发生变化时,所有依赖于它的对象都能够及时得到通知并做出相应的响应。 在 C# 中,我们可以使用委托来实现观察者模式。具体实现步骤如下: 1. 定义一个委托类型,用于通知观察者对象。 ```csharp public delegate void EventHandler(object sender, EventArgs e); ``` 2. 定义一个主题类,它包含一个事件和一个触发事件的方法。 ```csharp public class Subject { public event EventHandler Notify; public void Change() { Notify?.Invoke(this, EventArgs.Empty); } } ``` 3. 定义一个观察者类,它包含一个处理事件的方法。 ```csharp public class Observer { public void Handle(object sender, EventArgs e) { Console.WriteLine("Received notification from subject."); } } ``` 4. 在主函数中创建主题对象和观察者对象,并将观察者对象注册到主题对象的事件中。 ```csharp static void Main(string[] args) { Subject subject = new Subject(); Observer observer = new Observer(); subject.Notify += observer.Handle; subject.Change(); } ``` 上述代码中,当主题对象的状态发生改变时,它会触发事件并通知所有注册到该事件中的观察者对象。观察者对象则会调用自己的处理方法来响应该事件。 以上就是使用委托实现观察者模式的基本步骤。当然,在实际应用中,我们还可以对该模式进行更加复杂的实现和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值