简介:
状态模式的意图是允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
介绍:
优点 | 1.将状态对象统一,对象状态的改变即改变对象的行为。 2.共用对象,减少个数,防止对象串用。 |
缺点 | 1.对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换状态,而且也需修改具体状态类对应的行为。 |
特点 | 1.对象的行为依赖对象的状态。 |
环境角色(Context) | 定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。 |
抽象状态角色(State) | 定义特定的状态所对应的行为。 |
具体状态角色(ConcreteState) | 每一个具体状态类都实现了环境(Context)的相应状态所对应的行为。 |
状态模式是对象本身状态内部的改变带来了行为的改变。
观察者模式是对象之间的关系(订阅通知)。
使用:
本案例的意思是货物付款和取消后,商家和快递的动作。
//Context
public sealed class Good
{
private State _state;
public bool isPayment;
public bool isCannel;
public Good()
{
_state = new Shop();
}
public void SetState(State state)
{
_state = state;
}
public void Action()
{
_state.Process(this);
}
}
//State
public interface State
{
void Process(Good order);
}
//ConcreteStateA
public sealed class Shop : State
{
public void Process(Good order)
{
//do something
order.SetState(new Express());
order.Action();
}
}
//ConcreteStateB
public sealed class Express : State
{
public void Process(Good order)
{
//do something
if (order.isCannel)
{
//退货
}
else if (order.isPayment)
{
//发货
}
}
}
//状态模式调用
Good order = new Good();
order.isPayment = true;
order.Action();
order.isCannel = true;
order.Action();