C#基础State模式(行为型模式)

C#基础State模式(行为型模式),第1张

C#基础State模式(行为型模式),第2张

在软件构建过程中,大测试提示:如果某些对象的状态发生变化,其行为也会随之变化。例如,如果文档处于只读状态,它所支持的行为可能与读写状态所支持的行为完全不同。我们如何在运行时根据对象的状态透明地改变对象的行为?而不引入对象操作和状态转换之间的紧密耦合?
意图:
允许对象在其内部状态改变时改变其行为。从而使对象看起来修改了行为
公共类上下文
{
私有状态m _ state
公共上下文(State State)
{
m _ State = State;
}
public void ChangeState(State State)
{
m _ State = State;
}
public void Handle()
{
m _ State。操作(这个);
}
}
公共抽象类状态
{
公共抽象void Operate(Context CTX);
}
公共类concrete statea:State
{
公共重写void Operate(Context CTX)
{
Console。WriteLine("状态由A处理");
ctx。ChangeState(new concrete stateb());
}
}
public类concrete stateb:State
{
public override void Operate(Context CTX)
{
Console。WriteLine("状态由B处理");
ctx。ChangeState(new concrete statea());
}
}
类程序
{
static void Main(string[]args)
{
State = new concrete stateb();
Context ctx =新上下文(状态);
ctx。handle();
ctx。handle();
ctx。handle();
ctx。handle();
控制台。read();
}
}
从上面的代码中,我们抽象出一个状态机的基类State,它有一个抽象方法Operate,通过这个方法的参数间接调用上下文的引用。我们在ConcreteStateA和ConcreteStateB中实现Operate方法,执行一段代码后自动切换到下一个状态。我们这里只有两种状态,所以它们互相切换。我们可以添加多个状态,使状态逐步切换。请注意,状态的切换不受上下文控制。在Context类中,我们保存私有变量State来存储当前上下文的状态。ChangeState方法我们让新的状态代替原来的状态参考,相当于切换状态。Handle方法处理客户端的请求,状态对象将操作其对应的方法。我们通过多态的概念自动调用相应的操作方法。在Operate方法中,我们不一定要传递上下文引用,但是当我们切换状态时,很有可能会改变上下文的其他属性或行为,所以这个地方传递上下文引用。上下文的处理方法。我们在这里只是演示如何相互切换。我们完全可以扩展其他方法,先切换一个状态,然后调用状态的Operate方法。当然,State还可以扩展其他方法来展现Context其他内容的变化
考试重点:
State模式将与特定状态相关的所有行为放入State的一个子类对象中,当对象状态切换时,切换响应对象;但同时维护了状态的接口,实现了具体操作与状态转换的解耦。
为不同的状态引入不同的对象使得状态转换更加清晰,并且可以保证不会出现不一致的状态,因为转换是原子性的——也就是说,要么完全转换,要么不转换
如果状态对象没有实例变量,那么所有的上下文都可以共享同一个状态对象,从而节省了对象开销。
这种模式避免了我们编写大量的if else或switch case语句,但很可能导致某些系统有太多的特定状态类,结果开发者可能会省略所有的状态类。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C#基础State模式(行为型模式)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情