介绍:
观察者模式是一种一对多的定义关系,让多个观察者对象同时监听一个主要对象,当这个主要对象发生变化时,会通知所有的观察者对象,使其发生相应的改变。
比较经典的例子为C#种的猫叫了,老鼠跑了,主人醒了。
所运用的关键字delegate event
打个在游戏具体场景的例子,当游戏结束时,需要弹出视频广告,并且显示结算界面UI
首先是游戏控制类:
public class GameController
{
private static GameController instance;
public static GameController Instance
{
get {
if (instance==null)
{
instance = new GameController();
}
return instance;
}
}
public delegate void MyDelegate();
public event MyDelegate myEvent;
public void GameOver()
{
Debug.Log("游戏结束");
if (myEvent != null)
{
myEvent();
}
}
}
定义一个MyDelegate的委托方法,委托我理解为这是一个可以变成任何它想成为的方法体,因为太飘渺了,所以在使用委托的时候脑子里先想好写出这个委托是用来干嘛的,在这里这个委托是用来装载当游戏结束是触发的一系列关联的方法体的。
有了这个想法,就基于委托下建立一个事件myEvent,事件在我的理解里就是一种通知,一个连接,a到b的一条线,几个台灯和插头用线连接着,插头通上电,台灯就亮了。
上面的委托是放了一些需要使用的方法,这里基于委托的对象(可能很多个台灯)定义一个事件(线)用来连接这个GameOver(插头)使其当一定条件下GameOver会触发事件来让台灯做出相应的反应。
广告的类:
public class Ads : MonoBehaviour {
public static Ads instance;
void Awake()
{
instance = this;
}
public void Show()
{
Debug.Log("显示广告");
}
}
结束界面的UI:
public class UIPanel : MonoBehaviour
{
public static UIPanel instance;
void Awake()
{
instance = this;
}
public void GameEndPanel()
{
Debug.Log("游戏结束界面");
}
}
此时其实这几个类与方法都没有任何的交集,下面来让他们互动起来
void Start () {
GameController.Instance.myEvent += Ads.instance.Show;
GameController.Instance.myEvent += UIPanel.instance.GameEndPanel;
GameController.Instance.GameOver();
}
额···为了图方便所以全用了单例形式表示,感觉这样理解观察者模式比较清楚一点,Ads.instance.Show(广告显示订阅了这个事件),UIPanel.instance.GameEndPanel(结束界面UI订阅的这个事件),然后只需要在某个阶段或者其他逻辑里只单单触发一下游戏结束GameOver(),相应的广告以及UI逻辑也会跟着执行了。