7

I was looking at this, http://en.wikipedia.org/wiki/Strategy_pattern and I understand the concept of the strategy pattern, but could someone explain the C# example a bit.

I dont really get the how and why of the definition of 'Strategy' in the Context class, why is it Func<T, T, T> but then just two params are passed in eg 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);
    }
}
Lazer
  • 90,700
  • 113
  • 281
  • 364

4 Answers4

9

A Func<T1,T2,TResult> is a delegate in the form of:

TResult function(T1 arg1, T2 arg2)

so, the Func has 2 argument types, and 1 return type. Therefore when consuming the func, you'll type

 (arg1, arg2) => return new TResult();
Robert Harvey
  • 178,213
  • 47
  • 333
  • 501
Jan Jongboom
  • 26,598
  • 9
  • 83
  • 120
3

Func<int, int, int> is a func that take two int arguments and returns an int - the last type in a Func definition is the return type.

Lee
  • 142,018
  • 20
  • 234
  • 287
1

A Func<T, T1, T2> is a delegate. A delegate is a type which represents a single function. In C# you can use functions like this instead of declaring a specific interface. If you wanted, you could use an interface which would look something like this:

interface IStrategy
{
     T Compute<T1, T2>();
}
codekaizen
  • 26,990
  • 7
  • 84
  • 140
0

A Func<T, T1, T2> is a delegate, and any delegate can be viewed as an anonymous interface.

Mark Seemann
  • 225,310
  • 48
  • 427
  • 736