重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
abstract class State
{
public abstract void Execute(Context context);
}
class StateA : State
{
public override void Execute(Context context)
{
if (context.filter == "+")
{
Console.WriteLine("此时执行加法运行");
}
else
{
context.State = new StateB();
}
}
}
class StateB : State
{
public override void Execute(Context context)
{
if (context.filter == "-")
{
Console.WriteLine("此时执行减法运行");
}
else
{
context.State = new StateC();
}
}
}
class StateC : State
{
public override void Execute(Context context)
{
if (context.filter == "*")
{
Console.WriteLine("此时执行乘法运行");
}
else
{
context.State = new StateD();
}
}
}
class StateD : State
{
public override void Execute(Context context)
{
if (context.filter == "/")
{
Console.WriteLine("此时执行除法运行");
}
else
{
context.State = new StateF();
}
}
}
class StateF : State
{
public override void Execute(Context context)
{
if (context.filter == "++")
{
Console.WriteLine("此时执行连加运行");
}
else
{
context.State = new StateG();
}
}
}
class StateG : State
{
public override void Execute(Context context)
{
Console.WriteLine("传入的不是‘+-*/’,该抛异常");//抛异常了,该终止了
}
}
class Context
{
public string filter = "+";
private State state;
public Context()
{
state = new StateA();
}
public State State
{
get
{
return state;
}
set
{
this.state = value;
Handle();
}
}
public void Handle()
{
state.Execute(this);
state = new StateA();//状态回归默认,
}
}
//前端
static void Main(string[] args)
{
Context c = new Context();
c.filter = "a";
c.Handle();//如果状态不回复默认,那么Context的state永远为stateG,下面执行就会得不到想要的
c.filter = "*";//
c.Handle();
Console.ReadLine();
}
总结:状态模式其实就是把对象的各种状态抽离出去成为一组相互独立可互相替换的对象,各个状态中满足条件则执行当前行为,不满足则转入下一个状态。
类似于策略模式,不过策略模式是客户指定当前执行某一策略,状态模式是默认执行某一状态,然后在状态中判断不符合要求就自动转下一个状态。
优点:避免了if else判断,维护起来方便,扩展起来方便,符合单一原则。
缺点:环境类和状态类互相依赖;各个条件分散成不同的类,看起来不直观,并且如果有新的状态加入,需要修改最后的状态类(改动很小)。不过比起庞大的条件语句块,这些缺点都可以忽略。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。