Как реализовать шаблон делегирования в c # с использованием делегатов? - PullRequest
0 голосов
/ 21 мая 2019

Я хочу реализовать шаблон делегирования с использованием делегатов

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 Ответ

1 голос
/ 21 мая 2019

Разница между шаблонами делегирования и наблюдателя заключается в уровне контроля вашего класса над делегатом / наблюдателем. В случае делегата предполагается, что ваш класс имеет полный контроль над тем, как должен использоваться делегированный класс. Наблюдаемый класс не имеет представления о том, как именно он будет использоваться другими классами. Также часто предполагается, что наблюдаемый класс может иметь любое количество наблюдателей, в то время как делегат обычно один. Я также упростил предоставленный код, пытаясь избежать ненужного класса PussyCat, чтобы исходный класс можно было настроить на использование любого делегата во время выполнения. Вы также можете найти класс CatObservable, чтобы понять идею реализации наблюдаемого-наблюдателя.

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