设计模式_状态模式
来源:互联网 发布:seo 刷关键词排名工具 编辑:程序博客网 时间:2024/05/22 10:58
State Pattern
Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时,允许其改变行为,这个对象看起来像改变了其类)
要说建造者模式是按照客户提供的顺序执行,那么这个是应对多种复杂顺序而设计,扩展性都差不多,俩者结合起来将会起到非常好的封装效果。
建造者模式适应
状态模式适应
例子
电梯有四种状态,关门,开门,运行,停止,在开门的时候不能运行,在运行的时候不能开门....... 第一感觉就是拿四个变量来判断,这样太难看了。
public abstract class LiftState { protected Context context; public void setContext(Context _context){ this.context=_context; } public abstract void open(); public abstract void close(); public abstract void run(); public abstract void stop();}关闭状态
public class ClosingState extends LiftState { @Override public void close() { System.out.println("close the lift"); } @Override public void open() { super.context.setLiftState(Context.openningState); super.context.getLiftState().open(); } @Override public void run() { super.context.setLiftState(Context.runningState); super.context.getLiftState().run(); } @Override public void stop() { super.context.setLiftState(Context.stoppingState); super.context.getLiftState().stop(); }}停止状态
public class StoppingState extends LiftState { @Override public void close() { //do nothing } @Override public void open() { super.context.setLiftState(Context.openningState); super.context.getLiftState().open(); } @Override public void run() { super.context.setLiftState(Context.runningState); super.context.getLiftState().run(); } @Override public void stop() { System.out.println("the lift is stoped"); }}运行状态
public class RunningState extends LiftState { @Override public void close() { //do nothing } @Override public void open() { //do nothing } @Override public void run() { System.out.println("lift is runing..."); } @Override public void stop() { super.context.setLiftState(Context.stoppingState); super.context.getLiftState().stop(); }}开门状态
public class OpenningState extends LiftState { @Override public void close() { super.context.setLiftState(Context.closingState); //调用的是Context中的方法 super.context.getLiftState().close(); //通过Context调用另一个状态的方法 } @Override public void open() { System.out.println("lift is open..."); } @Override public void run() { //do nothing } @Override public void stop() { //do nothing }}上下文对象
public class Context { public final static OpenningState openningState=new OpenningState(); public final static ClosingState closingState=new ClosingState(); public final static RunningState runningState=new RunningState(); public final static StoppingState stoppingState=new StoppingState(); private LiftState liftState; public LiftState getLiftState() { return liftState; } public void setLiftState(LiftState liftState) { this.liftState = liftState; this.liftState.setContext(this); //将该状态设置上下文对象 } public void close() { this.liftState.close(); } public void open() { this.liftState.open(); } public void run() { this.liftState.run(); } public void stop() { this.liftState.stop(); }}
场景测试
public class Client { public static void main(String[] args) { Context context=new Context(); context.setLiftState(Context.closingState); context.open(); context.close(); context.run(); context.stop(); }}/*上下文对象Context,成员属性LiftState,可设置四种状态,获取和改变状态,相当于一个公共容器四种状态的抽象LiftState,成员属性Context,可设置上下文对象,让四种状态都拥有同一个Context你中有我,我中有你,通过容器Context可以进行状态的切换,将四者联合成一体当状态改变时,通过父类的统一Context改变了LiftState状态,然后调用了改变后状态的方法也就是说*/
结果
lift is open...close the liftlift is runing...the lift is stoped
我是菜鸟,我在路上。
0 0
- 设计模式_状态模式
- 设计模式_状态模式
- 设计模式_状态模式
- 设计模式_状态模式
- 设计模式_状态模式
- 设计模式_状态模式
- 设计模式_状态设计模式
- java设计模式_状态模式
- 设计模式_状态模式(Java)
- Unity_设计模式_状态模式_05
- 设计模式_状态模式(23)
- Java设计模式_(行为型)_状态模式
- 23中设计模式之_状态模式
- HeadFirst设计模式_读书笔记_010_状态模式
- Unity常用的设计模式_状态模式
- 设计模式:状态模式
- 设计模式-----状态模式
- 设计模式 状态模式
- 类似淘宝产品预览的快速实现(jquery)
- Python和C++求10000以内的所有素数(Eratosthenes筛选 求素数)
- 传感器获取旋转矩阵R,机身坐标系和世界坐标系的映射remapR,获得旋转角度 orientationValues;
- Eclipse使用总结
- sgu297:Fair-play(水题)
- 设计模式_状态模式
- HDU 1222 Wolf and Rabbit 幸存的兔子
- [leetcode 80, Medium] Remove Duplicates from Sorted Array II
- 关于C/C++中内存分配与释放的疑惑?
- crossApp初级-CAIamgeView-6
- poj 2031 Building a Space Station
- 黑马程序员——Java基础-IO流
- 服务器的响应数据
- MySQL-5.6.25数据库免安装配置