2010-01-12 26 views
7

Tôi đã xem xét điều này, http://en.wikipedia.org/wiki/Strategy_pattern và tôi hiểu khái niệm về mẫu chiến lược, nhưng ai đó có thể giải thích ví dụ C# một chút.Cố gắng hiểu ví dụ mẫu chiến lược wikipedia bằng cách sử dụng Func <int, int, int>

Tôi không thực sự hiểu được cách thức và lý do định nghĩa 'Chiến lược' trong lớp Ngữ cảnh, tại sao lại là Func<T, T, T> nhưng sau đó chỉ hai tham số được chuyển vào ví dụ 8,9?

static void Main(string[] args) 
{ 

    var context = new Context<int>(); 

    // Delegate 
    var concreteStrategy1 = new Func<int, int, int>(PerformLogicalBitwiseOr); 

    // Anonymous Delegate 
    var concreteStrategy2 = new Func<int, int, int>(
     delegate(int op1, int op2) 
     { 
      return op1 & op2; 
     }); 

    // Lambda Expressions 
    var concreteStrategy3 = new Func<int, int, int>((op1, op2) => op1 >> op2); 
    var concreteStrategy4 = new Func<int, int, int>((op1, op2) => op1 << op2); 

    context.Strategy = concreteStrategy1; 
    var result1 = context.Execute(8, 9); 

    context.Strategy = concreteStrategy2; 
    var result2 = context.Execute(8, 9); 

    context.Strategy = concreteStrategy3; 
    var result3 = context.Execute(8, 1); 

    context.Strategy = concreteStrategy4; 
    var result4 = context.Execute(8, 1); 

} 

static int PerformLogicalBitwiseOr(int op1, int op2) 
{ 
    return op1 | op2; 
} 

class Context<T> 
{ 
    public Func<T, T, T> Strategy { get; set; } 

    public T Execute(T operand1, T operand2) 
    { 
     return this.Strategy != null 
      ? this.Strategy(operand1, operand2) 
      : default(T); 
    } 
} 

Trả lời

9

Một Func<T1,T2,TResult> là một đại biểu trong các hình thức:

TResult function(T1 arg1, T2 arg2) 

vậy, Func có 2 loại đối số, và 1 kiểu trả về. Vì vậy khi tiêu thụ các func, bạn sẽ gõ

(arg1, arg2) => return new TResult(); 
+0

Ý của bạn là: Hàm T (T1 arg1, T2 arg2)? –

+0

Bạn có thể đặt tên 'T' tất cả mọi thứ bạn muốn, vì vậy ở đây' TResult' cho lời giải thích tốt hơn. –

3

Func<int, int, int> là một func mà phải mất hai đối số int và trả về một int - loại cuối cùng trong một định nghĩa Func là kiểu trả về.

+1

Nói chung, không phải lúc nào. –

1

A Func<T, T1, T2> là đại biểu. Đại biểu là một loại đại diện cho một hàm duy nhất. Trong C#, bạn có thể sử dụng các hàm như thế này thay vì khai báo một giao diện cụ thể. Nếu bạn muốn, bạn có thể sử dụng giao diện trông giống như sau:

interface IStrategy 
{ 
    T Compute<T1, T2>(); 
} 
Các vấn đề liên quan