前言
当我们项目中的代码越来越多时,就会出现一些复杂程度上或是代码逻辑上的问题,这时候就需要用一些固定的解决方案来帮助我们解决问题。这些解决方案不仅可以解决代码框架结构的问题,而且可以很好的降低代码之间的耦合度。这些解决方案就是设计模式。而观察者模式就是设计模式中的一种。
一、啥子是观察者模式?
观察者模式定义了一个一对多的依赖关系,让多个观察者监听同一个主体对象,当主体对象发生变化时,会通知所有的观察者,使观察者可以自己进行更新。
二、注意看!这有个非观察者与观察者的对比!
在游戏开发过程中,我们不可避免的要考虑到游戏的暂停功能,而且游戏的暂停功能要同时对游戏内的所有对象起效,下面我们就模拟游戏的暂停功能。
以下是两种方式的实现。
非观察者模式代码
让我们来瞅瞅非观察者模式的代码
using UnityEngine;
public class Boss
{
public void Stop()
{
Debug.Log("我是Boss, 我已暂停");
}
}-
public class Npc
{
public void Stop()
{
Debug.Log("我是Npc, 我已暂停");
}
}
public class Gamer
{
public void Stop()
{
Debug.Log("我是玩家, 我已暂停");
}
}
public class Observer : MonoBehaviour
{
Boss boss;
Npc npc;
Gamer gamer;
void Start()
{
boss = new Boss();
npc = new Npc();
gamer = new Gamer();
}
void Update()
{
//单击鼠标左键,让每个类暂停
if (Input.GetMouseButtonDown(0))
{
boss.Stop();
npc.Stop();
gamer.Stop();
}
}
}
在上段代码中,当我们点击鼠标左键的时候,都会主动调用每个对象的暂停方法,然我们想象一下,一个游戏内有多少对象?100?1000?难道我们每次都得主动调用成百上千的对象中的方法?这还还是一处,如果我们要多处调用呢?由此可见,使用这种方式的话,调用方法的代码量就成倍增加了。
观察者模式代码
为了避免上述情况, 我们的观察者模式就来了!
using UnityEngine;
using System.Collections.Generic;
public interface Character
{
void Stop();
}
public class Boss : Character
{
public void Stop()
{
Debug.Log("我是Boss, 我已暂停");
}
}
public class Npc : Character
{
public void Stop()
{
Debug.Log("我是Npc, 我已暂停");
}
}
public class Gamer : Character
{
public void Stop()
{
Debug.Log("我是玩家, 我已暂停");
}
}
//定义一个被观察的对象
public class ObservedSubject
{
public List<Character> chatacters = new List<Character>();
//添加观察者
public void AddOb(Character theC)
{
chatacters.Add(theC);
}
public void RemoveOb(Character theC)
{
chatacters.Remove(theC);
}
public void RunOb()
{
foreach (Character theC in chatacters)
{
theC.Stop();
}
}
}
public class Observer : MonoBehaviour
{
ObservedSubject observerSubject;
void Start()
{
observerSubject = new ObservedSubject();
observerSubject.AddOb(new Boss());
observerSubject.AddOb(new Npc());
observerSubject.AddOb(new Gamer());
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
observerSubject.RunOb();
}
}
}
对于被观察的主体来说,它只负责发消息,并不知道谁接收消息,谁执行什么方法;而对于观察者来说,则只会监听消息,没消息不会调用任何事件,如果有消息就调用对应事件,不用在意是谁发的消息。这样我们就降低了代码的耦合性,对优化代码的整体框架都有帮助,也便于后期修改。
三、如何使用观察者模式
使用观察者模式的大概思路为下:
1:创建一个观察者的接口 (上文中的 Character 接口)
2:创建多个观察者类并继承观察者接口(上文中的Boss, Npc, Gamer类继承了Character)
3:创建一个被观察的主体(上文中的 observerSubject 类)
4:在满足对应条件下通过被观察主体向观察者发消息,使观察者调用对应方法。
总结
合理的使用观察者模式,可以有效降低我们代码的耦合性,同时也有利于后期进行修改!(本篇文章若有错误,欢迎指正!)