如何使用委托在 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");
}
}
我想使用委托来实现委托模式
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");
}
}