状态模式

  状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。它将一群行为封装在状态对象中,context的行为随时可委托到那些状态对象中的一个。随着时间的流逝,当前状态在状态对象中游走改变,以反映出context内部的状态,因此context的行为也会跟着改变。但是context的客户对于状态对象了解不多,甚至是浑然不觉。

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

  状态模式类图如下所示:
在这里插入图片描述

  • Context(上下文)是一个类,它可以拥有一些内部状态。不管什么时候,只要有人调用Context的request()方法,它就会被委托到状态来处理。
  • State接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,状态之间可以相互转换。
  • ConcreteState(具体状态)处理来自context的请求。每一个ConcreteState都提供了它自己对于请求的实现。所以,当Context改变状态时行为也跟着改变。

  以下是一个实现状态模式的例子,来源于《Head first设计模式》相应章节:GumballMachine

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值