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

时间:2019-05-21 10:24:18

标签: c# design-patterns delegates delegation

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

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");
    }
}

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

如果前面的示例是正确的,并且我可以使用委托来实现委托模式和观察者模式,那么观察者模式和委托模式之间的区别是什么?

1 个答案:

答案 0 :(得分:1)

委托和观察者模式之间的差异是您的类对委托/观察者的控制级别。 如果是委托,则假定您的类完全控制应如何使用委托类。可观察类不知道其他类将如何使用它。 人们通常还认为,可观察类可以有任意数量的观察者,而委托通常是一个。 我还简化了所提供的代码,以避免不必要的类PussyCat,因此可以将原始类配置为在运行时使用任何委托。 您还可以找到CatObservable类来了解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");
    }
}