赞
踩
最近看游戏设计模式,当看到观察者模式时被搞得云里雾里的,什么观察者,被观察者,抽象观察者,抽象被观察者。听着这些词就觉得可怕,其实理解以后还是比较简单的。
当我们玩游戏时,经常会出现一些事件,而这个事件可能会影响到许多个模块时就可以用到观察者模式。例如:当我们在游戏中被丧尸咬时,我们就触发了变身丧尸的特殊事件,此时我们本身的人物模型可能会改变,同时系统的背景音乐和战斗方式也可能改变。此时就是一个事件影响多个模块的状况了,就可以用到观察者模式,废话不多说直接上代码。
- /// <summary>
- /// 抽象观察者,定义接收通知的接口
- /// </summary>
- public abstract class Observer
- {
- public abstract void OnNotify();
- }
- /// <summary>
- /// 抽象主题(抽象被观察者)类,内含观察者列表和实现接收各种通知
- /// </summary>
- public abstract class Subject
- {
- private List<Observer> observerList = new List<Observer>();
- /// <summary>
- /// 添加观察者
- /// </summary>
- /// <param name="observer"></param>
- public void AddObserver(Observer observer)
- {
- observerList.Add(observer);
- }
- /// <summary>
- /// 移除观察者
- /// </summary>
- /// <param name="observer"></param>
- public void RemoveObserver(Observer observer)
- {
- observerList.Remove(observer);
- }
- /// <summary>
- /// 推送通知
- /// </summary>
- public void Notify()
- {
- foreach (Observer o in observerList)
- {
- o.OnNotify();
- }
- }
- }

- /// <summary>
- /// 具体主题(被观察者)类,实现要推送的主题
- /// </summary>
- public class Boss : Subject
- {
- private string _command;
- public string Command
- {
- get { return _command; }
- set { _command = value; }
- }
- }
具体主题类是真正实现要推送的消息,我们确认一个事件是否推送和如何推送消息的方法等都是在这里完成的。
- /// <summary>
- /// 观察者类,当接收到推送通知时,实现各个模块功能
- /// </summary>
- public class EmployeeA:Observer
- {
- private string _name;
- private string _doSomething;
- private Boss _boss;
-
- public string Name
- {
- get { return _name; }
- set { _name = value; }
- }
- public string DoSomething
- {
- get { return _doSomething; }
- set { _doSomething = value; }
- }
- public EmployeeA(Boss boss)
- {
- _boss = boss;
- }
- public override void OnNotify()
- {
- if (_boss.Command == "下达命令")
- {
- Debug.Log("我是" + _name + "我要" + DoSomething);
- }
- }
- }

下面是完整的代码:
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using System;
-
- public class ObserverPattern : MonoBehaviour {
- /// <summary>
- /// 抽象观察者,定义接收通知的接口
- /// </summary>
- public abstract class Observer
- {
- public abstract void OnNotify();
- }
-
- /// <summary>
- /// 抽象主题(抽象被观察者)类,内含观察者列表和实现接收各种通知
- /// </summary>
- public abstract class Subject
- {
- private List<Observer> observerList = new List<Observer>();
- /// <summary>
- /// 添加观察者
- /// </summary>
- /// <param name="observer"></param>
- public void AddObserver(Observer observer)
- {
- observerList.Add(observer);
- }
- /// <summary>
- /// 移除观察者
- /// </summary>
- /// <param name="observer"></param>
- public void RemoveObserver(Observer observer)
- {
- observerList.Remove(observer);
- }
- /// <summary>
- /// 推送通知
- /// </summary>
- public void Notify()
- {
- foreach (Observer o in observerList)
- {
- o.OnNotify();
- }
- }
- }
-
- /// <summary>
- /// 具体主题(被观察者)类,实现要推送的主题
- /// </summary>
- public class Boss : Subject
- {
- private string _command;
- public string Command
- {
- get { return _command; }
- set { _command = value; }
- }
- }
-
- /// <summary>
- /// 观察者类,当接收到推送通知时,实现各个模块功能
- /// </summary>
- public class EmployeeA:Observer
- {
- private string _name;
- private string _doSomething;
- private Boss _boss;
-
- public string Name
- {
- get { return _name; }
- set { _name = value; }
- }
- public string DoSomething
- {
- get { return _doSomething; }
- set { _doSomething = value; }
- }
- public EmployeeA(Boss boss)
- {
- _boss = boss;
- }
- public override void OnNotify()
- {
- if (_boss.Command == "下达命令")
- {
- Debug.Log("我是" + _name + "我要" + DoSomething);
- }
- }
- }
-
- public class EmployeeB : Observer
- {
- private string _name;
- private string _doSomething;
- private Boss _boss;
-
- public string Name
- {
- get { return _name; }
- set { _name = value; }
- }
- public string DoSomething
- {
- get { return _doSomething; }
- set { _doSomething = value; }
- }
- public EmployeeB(Boss boss)
- {
- _boss = boss;
- }
- public override void OnNotify()
- {
- if (_boss.Command == "下达命令")
- {
- Debug.Log("我是" + _name + "我要" + DoSomething);
- }
- }
- }
-
- public class EmployeeC : Observer
- {
- private string _name;
- private string _doSomething;
- private Boss _boss;
-
- public string Name
- {
- get { return _name; }
- set { _name = value; }
- }
- public string DoSomething
- {
- get { return _doSomething; }
- set { _doSomething = value; }
- }
- public EmployeeC(Boss boss)
- {
- _boss = boss;
- }
- public override void OnNotify()
- {
- if (_boss.Command == "下达命令")
- {
- Debug.Log("我是" + _name + "我要" + DoSomething);
- }
- }
- }
-
- void Start()
- {
- Boss boss = new Boss();
- EmployeeA employeeA = new EmployeeA(boss);
- EmployeeA employeeB = new EmployeeA(boss);
- EmployeeA employeeC = new EmployeeA(boss);
-
- employeeA.Name = "雇员A";
- employeeA.DoSomething = "打扫卫生";
- employeeB.Name = "雇员B";
- employeeB.DoSomething = "整理货物";
- employeeC.Name = "雇员C";
- employeeC.DoSomething = "清算账目";
-
- boss.AddObserver(employeeA);
- boss.AddObserver(employeeB);
- boss.AddObserver(employeeC);
-
- boss.Command = "下达命令";
- boss.Notify();
- }
-
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。