Delegate có thể giúp ta xậy dựng một hệ thống cho phép người dùng có thể quyết
định một cách động trình tự thực thi các thao tác. Giả sử chúng ta có hệ thống sử lý
ảnh, hệ thống này có thể thao tác ảnh theo nhiều cách như: làm mờ (blur) ảnh, làm sắc nét, quay, lọc v.v…ảnh. Cũng giả sử rằng trình tự áp dụng các hiệu ứng trên ảnh hưởng lớn đến đến chất lượng của ảnh. Người dùng sẽ mong muốn chọn các hiệu
ứng họ lẫn trình tự của chúng từ một thực đơn, sau đó hệ thống sẽ thực hiện các hiệu ứng này theo trình tự họđã định.
Ta có thể tạo một delegate cho mỗi thao tác (hiệu ứng) và đẩy chúng vào một túi chứa có thứ tự, như một mảng chẳng hạn, theo đúng trình tự nó sẽ được thực thi. Khi tất cả các delegateđược tạo và thêm vào túi chứa, ta chỉđơn giản duyệt suốt mảng, gọi các delegate khi tới lượt.
Ta bắt đầu tạo lớp Image để đại diện cho một bức ảnh sẽ được xử lý bởi
ImageProcessor:
public class Image {
public Image( ) {
Console.WriteLine("An image created"); }
}
Lớp ImageProcessor khai báo một delegate không tham số và trả về kiểu
void
public delegate void DoEffect( );
Sau đó khai báo một số phương thức để thao tác ảnh có nguyên mẫu hàm như
delegateđã khai báo ở trên.
public static void Blur( ) {
Console.WriteLine("Blurring image"); }
public static void Filter( ) {
Console.WriteLine("Filtering image"); }
public static void Sharpen( ) {
Console.WriteLine("Sharpening image"); }
public static void Rotate( ) {
Console.WriteLine("Rotating image"); }
Lớp ImageProccessor cần một mảng để giữ các delegate người dùng chọn; một biến để giữ số lượng hiệu ứng muốn xử lý và hiển nhiên một bức ảnh image
DoEffect[] arrayOfEffects; Image image;
int numEffectsRegistered = 0;
ImageProccessor cũng cần một phương thức để thêm delegate vào mảng
public void AddToEffects(DoEffect theEffect) {
if (numEffectsRegistered >= 10) {
throw new Exception("Too many members in array"); }
arrayOfEffects[numEffectsRegistered++] = theEffect; }