如何使用委托在 C# 中实现委托模式?

How implement a delegation pattern in c# using delegates?

我想使用委托来实现委托模式

public class Cat {
    private delegate void SoundDelegate();
    private SoundDelegate sound;
    public Cat() {
        sound = new SoundDelegate(SomeClass.DoSound1);
    }
    public void DoSound() {
        sound();
    }
}
public class PussyCat {
    private delegate void SoundDelegate();
    private SoundDelegate sound;
    public PussyCat() {
        sound = new SoundDelegate(SomeClass.DoSound2);
    }
    public void DoSound() {
        sound();
    }
}
public class SomeClass {
    public static void DoSound1() {
        Console.WriteLine("Sound 1");
    }
    public static void DoSound2() {
        Console.WriteLine("Sound 2");
    }
}

这段代码是否实现了委托模式?我的意思是我可以使用委托来实现委托模式还是这种方式不正确。

而如果前面的例子是正确的,我可以使用delegates来实现委托模式和观察者模式,那么观察者模式和委托模式的区别和相似之处是什么?

委托模式和观察者模式之间的区别在于您的 class 对 delegate/observer 的控制级别。 在委托的情况下,假定您的 class 可以完全控制委托 class 的使用方式。 observable class 不知道其他 classes 将如何使用它。 人们还经常假设 observable class 可以有任意数量的观察者,而 delegate 通常是一个。 我还简化了提供的代码,试图避免不必要的 class PussyCat,因此可以将原始 class 配置为在运行时使用任何委托。 您还可以找到 CatObservable class 以了解 observable-observer 实现的想法。

class Program
{
    static void Main(string[] args)
    {
        Cat cat1 = new Cat(SomeClass.DoSound1);
        Cat cat2 = new Cat(SomeClass.DoSound2);

        CatObservable cat3 = new CatObservable();
        cat3.Sound += Cat3_Sound;
        cat3.Sound += (object sender, EventArgs e) => { SomeClass.DoSound1(); } ;
        cat3.Sound += (object sender, EventArgs e) => { SomeClass.DoSound2(); };


    }

    private static void Cat3_Sound(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
}

public class Cat
{
    public delegate void SoundDelegate();
    public SoundDelegate Sound { get; set; }

    public Cat(SoundDelegate soundDelagate)
    {
        Sound = soundDelagate;
    }
    protected void DoSound()
    {
        if (Sound!=null)
            Sound();
    }
}

public class CatObservable
{
    public event EventHandler Sound;
    public CatObservable()
    {
    }
    protected void DoSound()
    {
        if (Sound != null)
            Sound(this, EventArgs.Empty);
    }
}

public class SomeClass
{
    public static void DoSound1()
    {
        Console.WriteLine("Sound 1");
    }
    public static void DoSound2()
    {
        Console.WriteLine("Sound 2");
    }
}