7

我在看这个,http ://en.wikipedia.org/wiki/Strategy_pattern ,我理解策略模式的概念,但有人可以解释一下 C# 示例。

我并没有真正了解 Context 类中“策略”定义的方式和原因,为什么会这样,Func<T, T, T>但只有两个参数传入例如 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);
    }
}
4

4 回答 4

9

AFunc<T1,T2,TResult>是一个形式的代表:

TResult function(T1 arg1, T2 arg2)

所以,Func 有 2 种参数类型和 1 种返回类型。因此,在使用 func 时,您将输入

 (arg1, arg2) => return new TResult();
于 2010-01-12T22:06:32.897 回答
3

Func<int, int, int>是一个接受两个 int 参数并返回一个 int 的 func - Func 定义中的最后一个类型是返回类型。

于 2010-01-12T22:07:20.303 回答
1

AFunc<T, T1, T2>是代表。委托是代表单个函数的类型。在 C# 中,您可以使用这样的函数,而不是声明特定的接口。如果您愿意,您可以使用如下所示的界面:

interface IStrategy
{
     T Compute<T1, T2>();
}
于 2010-01-12T22:09:12.780 回答
0

AFunc<T, T1, T2>是一个委托,任何委托都可以看作是一个匿名接口

于 2010-01-12T22:09:02.643 回答