状态(State)模式

对象状态影响对象行为

对象拥有不同的状态,往往会行使不同的行为...

1、动机
在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化。比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。
如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之前引入紧耦合?

2、意图
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。 

3、图

4、代码

enum DocumentState
{ ReadOnly , Editable }

class Document
{
 DocumentState state;
 public void Handle
 {
  if( state = DocumentState.ReadOnly )
  {
   ... 
  }
  else if ( ... ) 
  {
   ...
  }
 }
}

----------------------------------------

//抽象类--表达状态及依赖状态的行为
abstract class StatedDocument
{
 public abstract void Handler1();
 public abstract void Handler2();
 public abstract void Handler3();

 public abstract StatedDocument Next
 {
  get;
  set; 
 }
}

//main logic 主逻辑
class Document 
{
 StatedDocument statedDocument;

 public void SetStatedDocument( StatedDocument  statedDocument )
 {
  this.statedDocument = statedDocument;
 }

 public void Handler1()
 {
  statedDocument.Handler1();
  statedDocument = statedDocument.Next;
 }

 public void Handler2()
 {
  statedDocument.Handler2();
 }

 public void Handler3()
 {
  statedDocument.Handler3();
 }
}

public class ReadOnlyDocument : StatedDocument
{
 public void Handler1()
 {
  ...
 }

 public void Handler2()
 {
  ...
 }

 public void Handler3()
 {
  ...
 }
}

public class EditableDocument : StatedDocument
{
 public void Handler1()
 {
  ...
 }

 public void Handler2()
 {
  ...
 }

 public void Handler3()
 {
  ...
 }
}

-------------------------------------------------------------------------------

public class Context
{
 private State state;

 public void sampleOperation()
 {
  state.sampleOperation();
 }

 public void setState( State state )
 {
  this.state = state;
 }
}

public interface State
{
 void sampleOperation();
}

public class ConcreteState : State
{
 public void sampleOperation(){};
}

5、要点

(1) State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象,但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
(2) 为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况。因为转换是原子性的——即要么彻底转换过来,要么不转换。
(3) 如果State对象没有实例变量,那么各个上下文可以共享同一个State对象,从而节省对象开销。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值