Unity 设计模式——观察者设计模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

使用场景:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

举例:我们用猫抓老鼠的来举例子。当汤姆猫进屋子的时候,杰瑞用跑步的方式逃跑,米老鼠骑自行车逃跑,舒克开坦克逃跑。

这个时候汤姆猫就是被观察者,有一个进屋子的方法。杰瑞,米老鼠,舒克就是观察者都有一个逃跑的方法。

优点: 1、观察者和被观察者是抽象耦合的,使用委托在观察者中注册事件更能大大降低耦合。 2、建立一套触发机制。

 被观察者,猫类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
/// <summary>
/// 猫
/// </summary>
public class Cat : MonoBehaviour
{
    private string name;
    private string color;

    public event Action CatAction;
    public Cat(string name,string color)
    {
        this.name = name;
        this.color = color;
    }
    void Start()
    {
        
    }

public void CatIntoRoom()
    {
        Debug.Log("叫" + name + "的" + color + "猫,进屋了。");
        CatAction?.Invoke();
    }
}

 老鼠抽象类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class Mouse 
{
    protected string name;
    public abstract void Run();
}

 观察者

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 米老鼠
/// </summary>
public class Mickey : Mouse
{
    public Mickey(string name,Cat cat)
    {
        this.name = name;
        cat.CatAction += Run;
    }
    public override void Run()
    {
        Debug.Log(name + "骑自行车,逃跑了");
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 杰瑞
/// </summary>
public class Jerry : Mouse
{
    public Jerry(string name,Cat cat)
    {
        this.name = name;
        cat.CatAction += Run;
    }
    public override void Run()
    {
        Debug.Log(name + "跑步,逃跑了");
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 舒克
/// </summary>
public class Schuck : Mouse
{
    public Schuck(string name, Cat cat)
    {
        this.name = name;
        cat.CatAction += Run;
    }
    public override void Run()
    {
        Debug.Log(name + "开坦克,逃跑了");
    }
}

调用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StartController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Cat cat = new Cat("汤姆", "蓝色");
        Jerry jerry = new Jerry("杰瑞", cat);
        Mickey mickey = new Mickey("米老鼠", cat);
        Schuck schuck = new Schuck("舒克", cat);


        cat.CatIntoRoom();
    }


}

 

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值