设计模式——状态模式

状态(State)模式:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的状态。



State:状态,定义抽象接口;
ConcreteState:具体状态类,每个子类实现一个Context的一个状态相关的行为;
Context:定义客户感兴趣的接口,维护一个ConcreteState子类的实例,这个实例定义为当前状态;

适用性:
(1)一个对象的行为取决于它的状态,并且它必须在允许时刻根据状态改变它的行为;
(2)一个操作有大量多分支的条件语句,且分支依赖于对象的状态。这个状态通常用一个或多个枚举常量表示;

优点:
(1)将所有与一个特定状态相关的行为放入一个类中,把不同的状态分割开来,使得增加新的状态很方便;
(2)使的状态的转换更加清晰;
(3)当State对象没有实例变量时,Context对象可以共享一个State对象;

缺点:
状态过多,会造成大量子类不方便管理

实现:
(1)为了让转换更灵活, Context中需要增加一个接口ChangeState,让State对象转换当前状态。缺点是一个State中包含其他State,造成了各个子类的依赖;
(2)可以使用表将每一个可能的输入映射到一个后继状态,这种方法将条件代码映射到一个查找表。缺点是效率低,可读性差,传入参数不方便;
(3)Context可以将自身作为一个参数传递给处理该请求的状态对象,让状态对象在方便时可以访问Context;
(4)当进入状态在运行时不可知时,并且不经常变更状态时,选择需要State对象时才创建并随后销毁;当State对象存储大量信息,并且状态改变很频繁时,应该预先创建并且始终不销毁它们;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值