C#学习笔记——观察者模式及实现

观察者模式,也称作发布/订阅模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象发生状态变化时,会通知所有观察者对象自动更新自己。这种模式通常被用来实现事件处理系统。

特点:发布者 + 订阅者 = 观察者模式

使用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();
    }
}

运行效果:
请添加图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值