观察者模式,也称作发布/订阅模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象发生状态变化时,会通知所有观察者对象自动更新自己。这种模式通常被用来实现事件处理系统。
特点:发布者 + 订阅者 = 观察者模式
使用C#语言和Unity引擎演示:猫抓老鼠案例,需求:猫来了,老鼠逃走
用普通类实现:
public class Animal
{
protected string Name;
public Animal(string name)
{
this.Name = name;
}
public virtual void Run()
{
}
}
public class Cat : Animal
{
public Cat(string name) : base(name)
{
}
public void Coming(Mouse mouseA, Mouse mouseB, Mouse mouseC)
{
Debug.Log(Name + "来了");
mouseA.Run();
mouseB.Run();
mouseC.Run();
this.Run();
}
public override void Run()
{
Debug.Log(Name + "开始追三只老鼠..........");
}
}
public class Mouse : Animal
{
public Mouse(string name) : base(name)
{
}
public override void Run()
{
Debug.Log(Name + "逃跑");
}
}
public class Visit : MonoBehaviour
{
void Start()
{
Cat cat = new Cat("小野猫");
Mouse mouseA = new Mouse("mouseA");
Mouse mouseB = new Mouse("mouseB");
Mouse mouseC = new Mouse("mouseC");
cat.Coming(mouseA, mouseB, mouseC);
}
}
运行效果:
普通类做法在增加老鼠需要重新实例化老鼠,添加新的老鼠参数,再次调用Run方法,这样的做法显然不合适。
观察者模式演示:
public class Animal
{
protected string Name;
public Animal(string name)
{
this.Name = name;
}
public virtual void Run()
{
}
}
public class Cat : Animal
{
//声明一个委托,相当于发布者
public Action actions;
public Cat(string name) : base(name)
{
}
public void Coming()
{
Debug.Log(Name + "来了");
if (actions != null)
actions();//通过多播委托实现一对多的关系
this.Run();
}
public override void Run()
{
Debug.Log(Name + "开始追三只老鼠..........");
}
}
public class Mouse : Animal
{
public Mouse(string name,Cat cat) : base(name)
{
cat.actions += this.Run;//相当于订阅者,把自身逃跑方法注册进猫的订阅消息
}
public override void Run()
{
Debug.Log(Name + "逃跑");
}
}
public class Visit : MonoBehaviour
{
void Start()
{
Cat cat = new Cat("小野猫");
Mouse mouseA = new Mouse("mouseA",cat);
Mouse mouseB = new Mouse("mouseB",cat);
Mouse mouseC = new Mouse("mouseC",cat);
//增加一只老鼠只需增加一行代码即可
Mouse mouseD = new Mouse("mouseD",cat);
cat.Coming();
}
}
运行效果: