Ответ 1
Делитель С# (не шаблон) может быть полезен, когда вы реализуете шаблон делегирования просто посмотрите на эту реализацию шаблона делегата из википедии с помощью мои изменения:
//NOTE: this is just a sample, not a suggestion to do it in such way
public interface I
{
void F();
void G();
}
public static class A
{
public static void F() { System.Console.WriteLine("A: doing F()"); }
public static void G() { System.Console.WriteLine("A: doing G()"); }
}
public static class B
{
public static void F() { System.Console.WriteLine("B: doing F()"); }
public static void G() { System.Console.WriteLine("B: doing G()"); }
}
public class C : I
{
// delegation
Action iF = A.F;
Action iG = A.G;
public void F() { iF(); }
public void G() { iG(); }
// normal attributes
public void ToA() { iF = A.F; iG = A.G; }
public void ToB() { iF = B.F; iG = B.G; }
}
public class Program
{
public static void Main()
{
C c = new C();
c.F(); // output: A: doing F()
c.G(); // output: A: doing G()
c.ToB();
c.F(); // output: B: doing F()
c.G(); // output: B: doing G()
}
}
Опять делегат может быть полезен здесь, но это не значит, что он был введен. Вы должны смотреть на него как на низкоуровневую конструкцию, а не на шаблон. В паре с событиями она может использоваться для реализации издателя/подписчика ( observer) - просто посмотрите в этой статье, или это может иногда помочь вам реализовать шаблон посетителя - это активно используется в LINQ:
public void Linq1()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
// n => n < 5 is lambda function, creates a delegate here
var lowNums = numbers.Where(n => n < 5);
Console.WriteLine("Numbers < 5:");
foreach (var x in lowNums)
{
Console.WriteLine(x);
}
}
Подводя итог: делегат языка не является самим шаблоном, он просто позволяет вам выполнять функции как объекты первого класса.