11.13闲话-委托与事件

11.13闲话-委托与事件

推荐

前言

其实委托与事件并不是必须品,如果你的码力超群,可以不使用oop、函数便可以切掉猪国杀,那完全不用学习委托与事件。

其作用就像函数、封装类似,为节省大量的无意义代码而诞生。

前言

先考虑为什么使用函数,第一点就是因为我们会多次使用相同的代码,第二点便是我们会使用相似的代码。

而委托事件就非常类似第二点。

不同的是我们会传入一个函数。

考虑我们现在有一个函数,调用会向控制台打印欢迎语。

很显然我们可以直接调用输出。

但现在我们的程序需要国际化,让我们的shit传遍天下

所以要支持多语言。

我们肯定可以暴力使用if判断不同语言。

但假如我们需要扩展,显然这么做就会使得代码过难维护。

但类比函数的思想,我们为什么不直接把函数当做参数传入另一个函数?

使用

Part.1 委托

public delegate void Greeting_Delegate(string name);

需要注意的是,声明的类型和参数要与函数一致

public void Greet_Others(string name, Greetint_Delegate Greet)
{
    Greet(name);
}
public void Greet_English(string name)
{
    DeBug.Log("Hello, " + name); // unity 调试方式
}

public void Greet_Chinese(string name)
{
    DeBug.Log("你好, " + name);
}

public static void Main()
{
    Greet_Others("Shadow", Greet_English);
    Greet_Others("涛哥", Greet_Chinese);
}

但是,只能这么做有点过于局限,所以,还可以这么用。

public class Greeting_Manager()
{
    public Greet_Delegate Delegate;

    public void Greet_Others(string name)
    {
        if (Delegate != null)
        {
            Delegate(name);
        }
    }
}

public static void Main()
{
    Greeting_Manager greetManager;
    greetManager.Delegate = Greet_English;
    greetManager.Delegate += Greet_Chiese;

    greetManager.Greet_Others("涛哥");

    Delegate("涛哥");
}

但到这总还是感觉缺点什么,为什么呢?

事件

一切都十分完美,但是其缺少了一定的权限,也就是我们的用户可以肆意的修改我们的委托,所以出现了事件。

事件可以使我们的操作只能 += (添加事件) 或 -= (删除事件)。

public class Greeting_Manager()
{
    public event Greet_Delegate Delegate;

    public void Greet_Others(string name)
    {
        if (Delegate != null)
        {
            Delegate(name);
        }
    }
}

public static void Main()
{
    Greeting_Manager greetManager = new Greeting_Manager();
    greetManager.Delegate += Greet_English;
    greetManager.Delegate += Greet_Chiese;

    greetManager.Greet_Others("涛哥");

    Delegate("涛哥");
}

Observer 设计模式

参考

p by wkh2008 && Qyun

posted @ 2024-11-13 20:42  碧蓝新星  阅读(96)  评论(8编辑  收藏  举报