博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式_状态模式
阅读量:6081 次
发布时间:2019-06-20

本文共 3476 字,大约阅读时间需要 11 分钟。

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
我是菜鸟,我在路上。

转载于:https://www.cnblogs.com/yutingliuyl/p/6706232.html

你可能感兴趣的文章
Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
查看>>
破解物联网落地困境-阿里云硬件接入最佳实践
查看>>
POJ 2503 字符串(两种方法)
查看>>
ArcGIS API for Flex 调用天地图、e都市瓦片地图
查看>>
【Yaml】Yaml学习笔记
查看>>
Mockito教程
查看>>
筛选并保留最后一次记录(如筛选最后一次缴纳电费的记录 )
查看>>
亚马逊开源 Neo-AI 框架,可优化 AI 模型提升部署速度
查看>>
新网盘时代,私有云斐讯天天链N1开启智能家居新生活!
查看>>
《西游伏妖篇》明星全阵容曝光 相约大年初一
查看>>
有一种手机能让你一见钟情,华为P20 Pro亮黑色图赏
查看>>
京东商城CEO徐雷年会演讲:我们抗住风霜 业务基本面良好
查看>>
德国飞往意大利民航客机机翼撕裂 途中乘客发现裂痕
查看>>
菜鸟保税仓成全球商家进中国首选 秒级通关领先全球
查看>>
退休延迟致新老职员共事 澳大利亚管理者面临挑战
查看>>
适当时公布?新西兰会否重启父母团聚移民引关注
查看>>
春运中的“洋导游”
查看>>
探访高铁“火花侠”驾驶火龙专列 脚下钢花飞溅
查看>>
2019年美联储加息若放缓有何影响?外汇局回应
查看>>
2018年访日外国游客消费创新高 中国大陆居首
查看>>