一、委托(delegate)
使用delegate关键词,表示一个委托,该委托是表示某一静态方法或某一类实例和该类的实例方法的数据结构。
delegate是一个类而不是一个方法
- [ 委托就是方法指针,仅仅指向方法的名称,不表示具体的执行过程 ]
- [ 方法指针是一种数据类型,它所处理的是方法引用过程的类型 ]
- [ 委托与被委托的方法必须“类型兼容”,即返回类型一致,参数类型一致 ]
代码示例:使用委托模拟photoshop添加滤镜
原始代码
Program.cs
class Program
{
static void Main(string[] args)
{
var photo = Photo.load("phtot.jpg");
var processor = new PhotoProcessor();
processor.Process(photo);
Console.Read();
}
}
Photo.cs
public class Photo
{
public static Photo load(string path)
{
return new Photo();
}
public void Save()
{
}
}
PhotoProcessor.cs
public class PhotoProcessor
{
public void Process(Photo photo)
{
var filters = new PhotoFilters();
filters.ApplyBrightness(photo);
filters.ApplyContrast(photo);
filters.Resize(photo);
photo.Save();
}
}
PhotoFilters.cs
public class PhotoFilters
{
public void ApplyBrightness(Photo photo)
{
Console.WriteLine("亮度增加");
}
public void ApplyContrast(Photo photo)
{
Console.WriteLine("对比度增加");
}
public void Resize(Photo photo)
{
Console.WriteLine("图片放大");
}
}
注意到,按照此时的代码,如果需要进一步添加滤镜,就需要在PhotoFilters中写入,并且在PhotoProcessor中进行调用,如此动作都是在修改源代码的基础上,因此,此时的源代码不具有任何可扩展性。因此使用委托来进行
PhotoProcessor.cs
public delegate void PhotoFiliterHandler(Photo photo);
public class PhotoProcessor
{
public void Process(Photo photo, PhotoFiliterHandler photoFiliterHandler)
{
photoFiliterHandler(photo);
photo.Save();
}
}
Program.cs
class Program