Both techniques can be powerful and valuable - here are some of my opinions about when to use which.
Use an Interface/Implementation approach when the strategy:
- maintains state
- needs configuration
- uses dependency injection
- needs to be configured by an IoC container (think ConnectionProvider)
- combines multiple responsibilities (think DataAdapter from ADO.NET)
- is too complex or long as a single method
- is likely to be subclassed to create new strategies
- needs to return state information to the caller
- needs to access internals of the object is applies to
- Would require too many direct parameters
Otherwise, tend to use delegates based on Func<> or Action<>, especially if
- There are likely to be a very large variety of strategies (think sort expressions)
- The strategy is best expressed as as lambda
- There's an existing method you want to leverage