【发布时间】:2019-05-19 19:13:37
【问题描述】:
AFAIK,策略设计模式is pretty simple:
界面:
public interface IStrategy
{
object DoAlgorithm(object data);
}
实现类:
lass ConcreteStrategyA : IStrategy
{
public object DoAlgorithm(object data)
{
var list = data as List<string>;
list.Sort();
return list;
}
}
class ConcreteStrategyB : IStrategy
{
public object DoAlgorithm(object data)
{
var list = data as List<string>;
list.Sort();
list.Reverse();
return list;
}
}
在 ctor 中获取 IStrategy 的上下文类:
class Context
{
private IStrategy _strategy;
public Context(IStrategy strategy)
{
this._strategy = strategy;
}
public void SetStrategy(IStrategy strategy)
{
this._strategy = strategy;
}
public void DoSomeBusinessLogic()
{
////
}
}
当然还有 Main 方法:
var context = new Context();
Console.WriteLine("Client: Strategy is set to normal sorting.");
context.SetStrategy(new ConcreteStrategyA());
context.DoSomeBusinessLogic();
问题:
好的,但是与以下内容相比有什么不同:
Istrategy context = new ConcreteStrategyA (); //or ConcreteStrategyB
Console.WriteLine("Client: Strategy is set to normal sorting.");
context.DoSomeBusinessLogic();
我错过了什么吗?为什么不只使用接口?
【问题讨论】:
-
您能否说明您的第二个建议如何解决“为我的操作选择排序算法”?到目前为止,您需要两个不同的
ConcreteStrategyA实现来替换排序......或者一般来说像“记录策略的数量”*“排序策略的数量”*......操作的实现...... -
@AlexeiLevenkov
class ConcreteStrategyB/A : IStrategy对于两个类应该保持不变。我可以使用if来选择我想要new的形式。在第一个示例中,他们做了context.SetStrategy(new ConcreteStrategyA());,而在我的示例中,我可以只做Istrategy context = new ConcreteStrategyA ();(如果这就是您要问的)。但是,如果这个想法是将功能添加到一个集中的地方,那么我理解。 (@milney 说过的话)
标签: c# design-patterns strategy-pattern