一 概要
1.1 行为型模式
- 特别关注对象之间的通信。描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。
1.2 定义
- 对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
二 UML类图
三 例子
public interface IState
{
void Handle(Context context);
}
public class Context
{
private IState state;
public void SetState(IState state)
{
this.state = state;
}
public IState GetState()
{
return this.state;
}
public void Request()
{
this.state.Handle(this);
}
}
public class StateA : IState
{
public void Handle(Context context)
{
// if ("满足某个条件")
{
context.SetState(new StateB());
context.Request();
}
}
}
public class StateB : IState
{
public void Handle(Context context)
{
// if ("满足某个条件")
{
context.SetState(new StateC());
}
}
}
public class StateC : IState
{
public void Handle(Context context)
{
// if ("满足某个条件")
{
context.SetState(new StateA());
}
}
}
public class Test
{
public Test()
{
Context context = new Context();
context.SetState(new StateA());
context.Request();
}
}
四 优缺点
4.1 优点
- 消除了庞大的条件分支语句, 把各种状态转移逻辑分布到State的子类之间。减少了相互间的依赖,使得代码更加容易维护和扩展。
- 状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。
4.2 缺点
1.每增加一个新的状态,都需要实现一个新的状态类, 如果该状态与原来的状态相关联,可能需要修改原来的状态类, 违背了开放封闭原则。
五 使用场景
- 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。
- 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。