Feedback summary
I will now close this thead (I think there will be no more feedback) and try to summarize what I understood
- using the "Context" as a parameter for my strategy introduces a tight coupling that should be avoided and also could force me to expose properties that should perhaps remain hidden in the class.
- To minimize coupling, it would be better to provide the needed values or at least to use an interface instead of a concrete type to the strategy.
I'm trying to get a clear overview of the strategy pattern and I'm asking myself if it is a good or bad design to have the strategy depends on the context.
Let's take the following classical implementation
//The strategy
interface IStrategy
{
void Execute();
}
class ConcreteStrategyA : IStrategy
{
public void Execute()
{
Console.WriteLine( "Called ConcreteStrategyA.Execute()" );
}
}
class ConcreteStrategyB : IStrategy
{
public void Execute()
{
Console.WriteLine( "Called ConcreteStrategyB.Execute()" );
}
}
//The context
class Context
{
IStrategy strategy;
// Constructor
public Context(IStrategy strategy)
{
this.strategy = strategy;
}
public void UpdateContext(IStrategy strategy)
{
this.strategy = strategy;
}
public void Execute()
{
strategy.Execute();
}
}
All examples I have seen have pretty simple strategies that take basic arguments (integers for example). What I would like to know is if there is something wrong if the strategy uses the Context to do the work.
It would give something like
//The strategy
interface IStrategy
{
void Execute(Context arg);
}
and the invocation would give
//The context
class Context
{
....
public void Execute()
{
strategy.Execute(this);
}
}
Is this "coupling" to be avoided? Is it ok?