【问题标题】:How implement a delegation pattern in c# using delegates?如何使用委托在 C# 中实现委托模式?
【发布时间】:2019-10-07 17:25:20
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# design-patterns delegates delegation


    【解决方案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");
        }
    }
    

    【讨论】:

    • 在委托模式上下文中,我可以说被观察类将事件委托给另一个类吗?还是不正确?
    • 我会说它将逻辑委托给另一个类而不是事件。而且我不确定观察到的类是代表的正确名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2010-11-04
    • 1970-01-01
    • 2012-04-02
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多