设计模式-观察者模式

概述

观察者模式是一种行为型的设计模式,其主要的是分为观察者和被观察者两部分,当被观察者出现任何变化的时候,会通知所有的观察者,主要就是这个逻辑。组成部分分为观察者接口,主题接口,具体的主题(被观察者),观察者,当被观察者的发生变化的时候,注册观察的所有观察者都被通知,举个例子,当点击游戏开始按钮的时候,所有注册游戏开始按钮事件的方法都会被执行,观察者模式,就好比事件的触发


例子:在我的世界中,僵尸发现村民在一定范围内的时候会追击村民,在范围外的时候不会追击。

观察者模式

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}距离不够,不追击村民");
            }
        }
    }
}

输出结果


僵尸小绿追击村民

僵尸小白距离不够,不追击村民

僵尸小黑距离不够,不追击村民


僵尸小绿距离不够,不追击村民

僵尸小白追击村民

僵尸小黑距离不够,不追击村民

相关推荐
静水流深_沧海一粟15 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder15 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室1 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20105 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈5 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||5 天前
安装依赖三方exe/msi的软件设计模式
设计模式