以玩游戏完成主线、副本任务为例
- UML图:
- 代码实现:
public class PlayGame
{
public delegate void EventHander();
public event EventHander EndNoticeEvent;//声明一个游戏结束通知事件
/// <summary>
/// 开始游戏
/// </summary>
public void BeginGame()
{
Console.WriteLine("开始游戏");
}
/// <summary>
/// 游戏结束
/// </summary>
public void GameOver()
{
Console.WriteLine("游戏结束");
Notice();//执行通知事件
}
/// <summary>
/// 通知
/// </summary>
public void Notice()
{
if (EndNoticeEvent != null)
{
EndNoticeEvent.Invoke();
}
}
}
/// <summary>
/// 主线任务
/// </summary>
public class MainTaskObserver
{
public void TaskEnd()
{
Console.WriteLine("完成当前主线任务");
}
}
/// <summary>
/// 副本任务
/// </summary>
public class ReplicaTaskObserver
{
public void TaskEnd()
{
Console.WriteLine("完成副本任务");
}
}
/// <summary>
/// 会员等级
/// </summary>
public class MemberGradeObserver
{
public void UpdateGrade()
{
Console.WriteLine("用户升级了");
}
}
public class PlayGameSubject
{
public void Play()
{
PlayGame playGame = new PlayGame();
playGame.BeginGame();
//绑定事件、游戏结束需要关联主线任务、副本任务、以及角色等级的改变
playGame.EndNoticeEvent += new MainTaskObserver().TaskEnd;
playGame.EndNoticeEvent += new ReplicaTaskObserver().TaskEnd;
playGame.EndNoticeEvent += new MemberGradeObserver().UpdateGrade;
playGame.GameOver();
}
}
- 调用端代码:
class Program
{
static void Main(string[] args)
{
var gameSubject = new PlayGameSubject();
gameSubject.Play();
Console.ReadLine();
}
}
- 运行效果:
- 总结
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发送变化时,会通知所有观察者对象,使它们能够自动更新自己。
代码下载地址:https://pan.baidu.com/s/1KTOO9XKN7lypbmV3H6-RoQ qd8h