“有大约2 * 3 * 6 = 36种不同的逻辑需要评估。”
“我们可以应用分治技术。”
- 您有6个状态。可以在此处使用责任链模式来选择适当的状态处理程序
- 找到所需的状态处理程序后,我们可以应用所需的函数。适当的函数可以视为策略。因此,这是可以应用策略模式的地方。
- 我们可以按适当的状态将策略分开,并将它们放入简单工厂中,以通过键获取所需的策略。
“这就是我们要做的事情。所以让我们更加深入地了解它。”
责任链模式
“如果您有很多if else语句,则可以使用
责任链模式。正如维基百科所说的
Chain of Responsibility
:”
责任链模式是一种行为设计模式,包含命令对象源和一系列处理对象。每个处理对象包含定义其可以处理的命令对象类型的逻辑;其余的则传递给链中的下一个处理对象。还存在一种机制,在此链的末尾添加新的处理对象。
让我们通过C#的示例来深入了解代码。
这是我们的Argument类,它具有左操作数和右操作数:
public class Arguments
{
public string Left { get; private set; }
public string Right { get; private set; }
public MyState MyState { get; private set; }
public MyKey MyKey => new MyKey(MyState, Left);
public Arguments(string left, string right, MyState myState)
{
Left = left;
Right = right;
MyState = myState;
}
}
这是你的6个州:
public enum MyState
{
One, Two, Three, Four, Five, Six
}
这是装饰者模式的开始。这是状态处理程序的抽象,它定义了设置下一个处理程序的行为:
public abstract class StateHandler
{
public abstract MyState State { get; }
private StateHandler _nextStateHandler;
public void SetSuccessor(StateHandler nextStateHandler)
{
_nextStateHandler = nextStateHandler;
}
public virtual IDifferentLogicStrategy Execute(Arguments arguments)
{
if (_nextStateHandler != null)
return _nextStateHandler.Execute(arguments);
return null;
}
}
它的具体实现包括
StateHandler
:
public class OneStateHandler : StateHandler
{
public override MyState State => MyState.One;
public override IDifferentLogicStrategy Execute(Arguments arguments)
{
if (arguments.MyState == State)
return new StrategyStateFactory().GetInstanceByMyKey(arguments.MyKey);
return base.Execute(arguments);
}
}
public class TwoStateHandler : StateHandler
{
public override MyState State => MyState.Two;
public override IDifferentLogicStrategy Execute(Arguments arguments)
{
if (arguments.MyState == State)
return new StrategyStateFactory().GetInstanceByMyKey(arguments.MyKey);
return base.Execute(arguments);
}
}
第三个状态处理程序看起来像这样:
public class ThreeStateHandler : StateHandler
{
public override MyState State => MyState.Three;
public override IDifferentLogicStrategy Execute(Arguments arguments)
{
if (arguments.MyState == State)
return new StrategyStateFactory().GetInstanceByMyKey(arguments.MyKey);
return base.Execute(arguments);
}
}
策略模式
让我们关注下面这行代码:
return new StrategyStateFactory().GetInstanceByMyKey(arguments.MyKey);
以上代码是使用
策略模式的示例。我们有不同的方式或策略来处理您的情况。让我展示一下评估您表达式的策略代码。
这是一个策略的抽象:
public interface IDifferentLogicStrategy
{
string Evaluate(Arguments arguments);
}
它的具体实现:
public class StrategyWildCardStateOne : IDifferentLogicStrategy
{
public string Evaluate(Arguments arguments)
{
return "StrategyWildCardStateOne";
}
}
public class StrategyIntegerStringStateOne : IDifferentLogicStrategy
{
public string Evaluate(Arguments arguments)
{
return "StrategyIntegerStringStateOne";
}
}
第三个策略是:
public class StrategyNormalStringStateOne : IDifferentLogicStrategy
{
public string Evaluate(Arguments arguments)
{
return "StrategyNormalStringStateOne";
}
}
简单工厂
简单工厂模式并不存在。然而,它是一个可以通过关键字获取策略实例的地方。这样做可以避免使用多个if else
语句来选择正确的策略。
因此,我们需要一个地方来存储状态和参数值的策略。首先,让我们创建MyKey
结构体。它将帮助我们区分状态和参数:
public struct MyKey
{
public readonly MyState MyState { get; }
public readonly string ArgumentValue { get; }
public MyKey(MyState myState, string argumentValue)
{
MyState = myState;
ArgumentValue = argumentValue;
}
public override bool Equals([NotNullWhen(true)] object? obj)
{
return obj is MyKey mys
&& mys.MyState == MyState
&& mys.ArgumentValue == ArgumentValue;
}
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + MyState.GetHashCode();
hash = hash * 23 + ArgumentValue.GetHashCode();
return hash;
}
}
}
然后我们可以创建一个简单的工厂:
public class StrategyStateFactory
{
private Dictionary<MyKey, IDifferentLogicStrategy>
_differentLogicStrategyByStateAndValue =
new Dictionary<MyKey, IDifferentLogicStrategy>()
{
{ new MyKey(MyState.One, "_"), new StrategyWildCardStateOne() },
{ new MyKey(MyState.One, "intString"),
new StrategyIntegerStringStateOne() },
{ new MyKey(MyState.One, "normalString"),
new StrategyNormalStringStateOne() }
};
public IDifferentLogicStrategy GetInstanceByMyKey(MyKey myKey)
{
return _differentLogicStrategyByStateAndValue[myKey];
}
}
所以我们已经编写了我们的策略,并将这些策略存储在简单工厂
StrategyStateFactory
中。
然后我们需要检查上述实现:
StateHandler chain = new OneStateHandler();
StateHandler secondStateHandler = new TwoStateHandler();
StateHandler thirdStateHandler = new ThreeStateHandler();
chain.SetSuccessor(secondStateHandler);
secondStateHandler.SetSuccessor(thirdStateHandler);
Arguments arguments = new Arguments("_", "_", MyState.One);
IDifferentLogicStrategy differentLogicStrategy = chain.Execute(arguments);
string evaluatedResult =
differentLogicStrategy.Evaluate(arguments); // output: "StrategyWildCardStateOne"
我相信我已经给出了如何完成这个基本想法的概述。