设计模式学习(十六):State

说明:由于本人是一个初学者,所以博客中用到的一些见解、图片、代码或者说明可能引用网络上面的资源,如果涉及到了侵权的问题请大家联系我进行删除。

这一篇博客主要记录了State(状态)模式的学习。在这里我们把State模式和Memento模式归为新的一类,即“状态变化”模式。

“状态变化”模式:

在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。


动机

在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。

如何在运行时根据对象的状态来透明的更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合。


模式定义

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


结构图


在结构图中,红色部分是稳定的部分,蓝色部分是变化的部分。


要点总结

State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作和状态转换之间的解耦。

为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况,因为转换时原子性的——即要么彻底转换过来,要么不转换。

如果State对象没有实例变量,那么各个上下文可以共享同一个State对象(这里一般会使用singleton模式),从而节省对象开销。


ps: 其实State模式和Strategy模式是很相似的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
状态模式是一种行为型设计模式,它允许对象在其内部状态发生改变时改变它的行为。 状态模式的核心思想是将对象的状态从对象本身中分离出来,并将状态的行为委托给代表该状态的对象。这样,当对象的状态发生改变时,它将委托给代表该状态的对象来处理行为,而不是在对象本身中进行判断和处理。 状态模式包含以下几个角色: 1. Context(上下文):定义客户端感兴趣的接口,并维护一个当前状态的引用。 2. State状态):定义状态的接口,并封装与该状态相关的行为。 3. ConcreteState(具体状态):实现状态的接口,并封装与该状态相关的行为。 下面以一个简单的电梯状态转换为例来说明状态模式: ```java // Context public class Elevator { private State state; public Elevator() { this.state = new ClosedState(); } public void setState(State state) { this.state = state; } public void open() { state.open(this); } public void close() { state.close(this); } public void run() { state.run(this); } public void stop() { state.stop(this); } } // State public interface State { void open(Elevator elevator); void close(Elevator elevator); void run(Elevator elevator); void stop(Elevator elevator); } // ConcreteState public class ClosedState implements State { @Override public void open(Elevator elevator) { System.out.println("电梯门打开"); elevator.setState(new OpenedState()); } @Override public void close(Elevator elevator) { System.out.println("电梯门已关闭"); } @Override public void run(Elevator elevator) { System.out.println("电梯开始运行"); elevator.setState(new RunningState()); } @Override public void stop(Elevator elevator) { System.out.println("电梯已停止"); } } public class OpenedState implements State { @Override public void open(Elevator elevator) { System.out.println("电梯门已打开"); } @Override public void close(Elevator elevator) { System.out.println("电梯门关闭"); elevator.setState(new ClosedState()); } @Override public void run(Elevator elevator) { System.out.println("电梯门未关闭,无法运行"); } @Override public void stop(Elevator elevator) { System.out.println("电梯已停止"); elevator.setState(new StoppedState()); } } public class RunningState implements State { @Override public void open(Elevator elevator) { System.out.println("电梯运行中,无法开门"); } @Override public void close(Elevator elevator) { System.out.println("电梯运行中,无法关门"); } @Override public void run(Elevator elevator) { System.out.println("电梯仍在运行中"); } @Override public void stop(Elevator elevator) { System.out.println("电梯已停止"); elevator.setState(new StoppedState()); } } public class StoppedState implements State { @Override public void open(Elevator elevator) { System.out.println("电梯门打开"); elevator.setState(new OpenedState()); } @Override public void close(Elevator elevator) { System.out.println("电梯门已关闭"); elevator.setState(new ClosedState()); } @Override public void run(Elevator elevator) { System.out.println("电梯开始运行"); elevator.setState(new RunningState()); } @Override public void stop(Elevator elevator) { System.out.println("电梯已停止"); } } ``` 在上面的例子中,电梯的状态可以是“开门状态”、“关门状态”、“运行状态”和“停止状态”,而这些状态的行为可以通过状态模式来进行封装和处理。具体来说,电梯的状态被封装为一个状态接口,并有不同的状态实现类来实现具体的行为。在上下文类中,我们维护了一个当前状态的引用,并将操作委托给当前状态的对象来处理。 当电梯的状态发生改变时,我们只需要更改当前状态的引用即可,而不需要在上下文类中进行状态判断和处理,从而使得代码更加清晰、简洁、可维护性更高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值