Ủ y quyền có thể giúp chúng ta tạo ra một hệ thống trong đó người sử dụng có thể quyết định đến thứ tự của các hoạt động khi thực thi. Giả sử chúng ta có một hệ thống xử lý ảnh trong đó các ảnh có thểđược thao tác bởi một phương pháp được định nghĩa tốt như là: làm mờ, làm đậm, xoay, lọc ảnh,... Giả sử rằng, thứ tự khi sử dụng các hiệu ứng này được áp dụng cho ảnh là quan trọng. Người sử dụng muốn lựa chọn những hiệu ứng này từ menu, anh ta chọn tất cả các hiệu ứng tùy thích, và sau đó yêu cầu bộ xứ lý ảnh thực hiện lần lượt các hiệu ứng mà anh ta đã xác định.
Chúng ta có thể tạo những ủy quyền cho mỗi hoạt động và sau đó thêm chúng vào một tập hợp được sắp, như là một mảng chẳng hạn, theo một thứ tự mà ta muốn chúng thực thi. Một khi tất cả các ủy quyền được tạo ra và đưa vào tập hợp, chúng ta dễ dàng lặp lần lượt qua các thành phần của mảng, và thực thi lần lượt từng phương thức ủy quyền.
Chúng ta bắt đầu bằng việc xây dựng một lớp Image thể hiện một ảnh sẽđược xử lý bởi lớp ImageProcessor:
public class Image {
public Image() {
Console.WriteLine(“An image created”); }
}
Chúng ta có thể tưởng tượng rằng việc xuất ra chuỗi như vậy tương ứng với việc tạo một ảnh .gif hay .jpeg hay đại loại như vậy.
Sau đó lớp ImageProcessor khai báo một ủy quyền. Dĩ nhiên là chúng ta có thểđịnh nghĩa một ủy quyền riêng trả về bất cứ kiểu dữ liệu nào hay lấy bất cứ tham số nào mà chúng ta muốn. Trong ví dụ này chúng ta định nghĩa một ủy quyền có thểđóng gói bất cứ phương thức không có giá trị trả về và cũng không nhận bất cứ tham số nào hết:
public delegate void DoEffect();
Tiếp tục lớp ImageProcessor khai báo một sô phương thức, và từng phương thức này phù hợp với ký pháp và kiểu trả vềđược khai báo bởi ủy quyề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 ImageProcessor cần thiết có một mảng để lưu giữ các ủy quyền mà người sử dụng chọn, một biến lưu giữ số hiệu ứng được chọn và dĩ nhiên là có một biến ảnh để xử lý:
DoEffect[] arrayOfEffects; Image image;
int numEffectsRegistered = 0;
ImageProcessor cũng cần một phương thức để thêm các ủy quyền vào trong mảng: public void AddToEffects( DoEffect theEffect)
{
if (numEffectsRegistered >=0) {
throw new Exception(“Too many members in array”); }
arrayOfEffects[numEffectsRegistered ++] = theEffect; }
Ngoài ra còn cần một phương thức thật sự gọi các ủy quyền này: public void ProcessImage()
{
for (int i = 0; i < numEffectsRegistered; i++) {
arrayOfEffects[i](); }
}
Cuối cùng, chúng ta khai báo những ủy quyền tĩnh, để các client gọi, và chặn chúng lại để xử lý những phương thức:
public DoEffect BlurEffect = new DoEffect(Blur);
public DoEffect FilterEffect = new DoEffect(Filter); public DoEffect RotateEffect = new DoEffect(Rotate);
Việc chọn các thao tác diễn ra trong quá trình tương tác ở thành phần giao diện người sử dụng. Trong ví dụ này chúng ta mô phỏng bằng cách chọn các hiệu ứng, thêm chúng vào trong mảng, và ProcessImage. Ví dụ minh họa 11.2: Sử dụng mảng ủy quyền. --- namespace Programming_CSharp { using System; // khai báo lớp ảnh public class Image {
public Image() {
Console.WriteLine(“An image created”); }
}
// lớp xử lý ảnh
public class ImageProcessor {
// khai báo ủy quyền
public delegate void DoEffect(); // tạo các ủy quyền tĩnh
public DoEffect BlurEffect = new DoEffect(Blur);
public DoEffect SharpenEffect = new DoEffect(Sharpen); public DoEffect FilterEffect = new DoEffect(Filter); public DoEffect RotateEffect = new DoEffect(Rotate); // bộ khởi dựng khởi tạo ảnh và mảng
public ImageProcessor(Image image) {
this.image = image;
arrayOfEffects = new DoEffect[10]; }
// thêm hiệu ứng vào trong mảng
public void AddToEffects( DoEffect theEffect) {
if (numEffectsRegistered >=0)
{
throw new Exception(“Too many members in array”); }
arrayOfEffects[numEffectsRegistered ++] = theEffect; }
// các phương thức xử lý ảnh 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”); }
// gọi các ủy quyền để thực hiện hiệu ứng public void ProcessImage()
{
for (int i = 0; i < numEffectsRegistered; i++) {
arrayOfEffects[i](); }
}
// biến thành viên
private DoEffect[] arrayOfEffects; private Image image;
private int numEffectsRegistered = 0; }
// lớp Test để kiểm chứng chương trình public class Test