概述
观察者模式是一种行为型的设计模式,其主要的是分为观察者和被观察者两部分,当被观察者出现任何变化的时候,会通知所有的观察者,主要就是这个逻辑。组成部分分为观察者接口,主题接口,具体的主题(被观察者),观察者,当被观察者的发生变化的时候,注册观察的所有观察者都被通知,举个例子,当点击游戏开始按钮的时候,所有注册游戏开始按钮事件的方法都会被执行,观察者模式,就好比事件的触发。
例子:在我的世界中,僵尸发现村民在一定范围内的时候会追击村民,在范围外的时候不会追击。
观察者模式
cs
using static POC;
using System.Numerics;
internal class Program
{
private static void Main(string[] args)
{
Villager villager = new Villager();
Zombie zombieOne = new Zombie("小绿", new Vector3(1, 1, 1));
Zombie zombieTwe = new Zombie("小白", new Vector3(3, 5, 7));
Zombie zombieThree = new Zombie("小黑", new Vector3(10, 16, 15));
villager.RegisterObserver(zombieOne);
villager.RegisterObserver(zombieTwe);
villager.RegisterObserver(zombieThree);
Console.WriteLine("----------------------------");
villager.SetPosition(new Vector3(0, 0, 0));//村民位置移动到0,0,0点
Console.WriteLine("----------------------------");
villager.SetPosition(new Vector3(5, 5, 7));//村民位置移动到5,5,7点
}
public interface IObserver//观察者接口
{
void Update(Vector3 positon);
}
public interface ISubject//主题接口
{
void RegisterObserver(IObserver observer);
void RemoveObserver(IObserver observer);
void NotifyObservers();
}
public class Villager : ISubject//村民类
{
private List<IObserver> _observers = new List<IObserver>();
private Vector3 positon;
public void RegisterObserver(IObserver observer)
{
_observers.Add(observer);
}
public void RemoveObserver(IObserver observer)
{
_observers.Remove(observer);
}
public void NotifyObservers()
{
foreach (var observer in _observers)
{
observer.Update(positon);
}
}
public void SetPosition(Vector3 pos)
{
positon = pos;
NotifyObservers();
}
}
public class Zombie : IObserver//僵尸类
{
private Vector3 _position;
private Vector3 villager_Position;
private string Name;
public Zombie(string name, Vector3 pos)
{
Name = name;
_position = pos;
}
public void Update(Vector3 position)
{
villager_Position = position;
CheckDistance();
}
public void CheckDistance()
{
if (Vector3.Distance(villager_Position, _position) <= 5)
{
Console.WriteLine($"僵尸{Name}追击村民");
}
else
{
Console.WriteLine($"僵尸{Name}距离不够,不追击村民");
}
}
}
}
输出结果
僵尸小绿追击村民
僵尸小白距离不够,不追击村民
僵尸小黑距离不够,不追击村民
僵尸小绿距离不够,不追击村民
僵尸小白追击村民
僵尸小黑距离不够,不追击村民