正如*所说的状态模式:
状态模式是一种行为软件设计模式,它允许
对象在其内部状态发生变化时改变其行为。这
模式接近于有限状态机的概念。
让我们谈谈现实世界的例子,它是汽车的方向盘。方向盘可以更换。我们可以设置更大或更小的方向盘。但是,我们认为小方向盘比大方向盘对汽车前轮的夹角更大,这不是一个规则。
因此,我们可以得出结论,我们的汽车的行为会因我们设置的转向工具而异。例如,如果我们设置较小的方向盘,我们的汽车会向左或向右转得更快。
因此,汽车会响应TurnLeft() 或TurnRight() 等事件。但是,汽车车轮可以转动的角度取决于当前选择的方向盘。让我们尝试编码:
public interface ISteeringWheel
{
void TurnLeft();
void Straight();
void TurnRight();
}
public class BigSteeringWheel : ISteeringWheel
{
public void Straight()
{
Console.WriteLine("BigSteeringWheel is straight");
}
public void TurnLeft()
{
Console.WriteLine("BigSteeringWheel is turned left 10
degrees");
}
public void TurnRight()
{
Console.WriteLine("BigSteeringWheel is turned right 10
degrees");
}
}
public class SmallSteeringWheel : ISteeringWheel
{
public void Straight()
{
Console.WriteLine("SmallHandleBar is straight");
}
public void TurnLeft()
{
Console.WriteLine("SmallHandleBar is turned left
20 degrees");
}
public void TurnRight()
{
Console.WriteLine("SmallHandleBar is turned right 20
degrees");
}
}
和Automobile 类:
public class Automobile
{
public ISteeringWheel SteeringWheel { get; private set; }
public Automobile()
{
SteeringWheel = new BigSteeringWheel();
}
public void TurnLeft()
{
SteeringWheel.TurnLeft();
}
public void TurnRight()
{
SteeringWheel.TurnRight();
}
public void SetSteeringWheel(ISteeringWheel handleBar)
{
SteeringWheel = handleBar;
}
}
策略模式:
来自*的定义:
策略模式(也称为策略模式)是一种
能够选择算法的行为软件设计模式
在运行时。不是直接实现单个算法,而是代码
接收关于在一系列算法中的哪一个的运行时指令
使用。
注意诸如«family of algorithm to use»之类的词。所以让我们假设我们有一辆真正的汽车,当驾驶员向左转动方向盘时,我们希望我们的汽车会执行以下操作:
因此,以上两个动作可以被视为«家庭算法使用»。
让我们编写这个例子。
方向盘算法:
public interface ISteeringWheel
{
void TurnLeft();
void Straight();
void TurnRight();
}
public class BigSteeringWheel : ISteeringWheel
{
public void Straight()
{
Console.WriteLine("BigSteeringWheel is straight");
}
public void TurnLeft()
{
Console.WriteLine("BigSteeringWheel is turned left
10 degrees");
}
public void TurnRight()
{
Console.WriteLine("BigSteeringWheel is turned right
10 degrees");
}
}
转向灯算法:
public interface ITurnSignal
{
void TurnOnLeft();
void TurnOnRight();
}
public class OrangeTurnSignal : ITurnSignal
{
public void TurnOnLeft()
{
Console.WriteLine("Left OrangeTurnSignal is turned on");
}
public void TurnOnRight()
{
Console.WriteLine("Right OrangeTurnSignal is turned on");
}
}
还有汽车类:
public class Automobile
{
public ISteeringWheel SteeringWheel { get; private set; }
public ITurnSignal TurnSignal { get; private set; }
public Automobile()
{
SteeringWheel = new BigSteeringWheel();
TurnSignal = new OrangeTurnSignal();
}
public void TurnLeft()
{
SteeringWheel.TurnLeft();
TurnSignal.TurnOnLeft();
}
public void TurnRight()
{
SteeringWheel.TurnRight();
TurnSignal.TurnOnRight();
}
}
结论:
State pattern 和 Strategy pattern 看起来非常相似。但是,State pattern 有一个单一状态,并且所有的行为,如 «TurnLeft» 和 «TurnRight» 都封装在一个类中,这有一个微小的区别。另一方面,Strategy pattern 没有单一状态,但它有许多状态,例如«SteeringWheel»和«TurnSignal»。这些不同的行为使用不同的策略对象进行封装,例如 «SteeringWheel» 和 «TurnSignal» 对象。因此,这是状态模式和策略模式之间的主要区别。
此外,我们可以将Strategy pattern 视为子类化的一个很好的替代方案。继承为我们提供了类之间非常紧密的耦合,并且类之间的这种耦合是在编译时定义的。但是,Strategy pattern 使用的组合允许在运行时通过与不同的对象组合来设置行为。
State pattern 也可以被视为替代类中许多if — else 语句的替代方案。