设计模式学习之路-状态模式
来源:互联网 发布:淘宝女装宝贝分类 编辑:程序博客网 时间:2024/04/29 13:50
状态模式,实时监测状态,当状态发生变化相应的也会进行一些更新。通过把各种状态转移逻辑分布到state的子类,来减少相互之间的依赖,可以消除庞大的条件分支语句。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
看看状态模式的UML类图:
基本逻辑代码
abstract class State{ public abstract void Handle(Context context);}
class ConcreteStateA extends State{ @Override public void Handle(Context context){ context.State = new ConcreteStateB(); }}
class ConcreteStateB extends State{ @Override public void Handle(Context context){ context.State = new ConcreteStateA(); }
class Context{ private State state; public Context(State state){ this.state = state; } public State state{ return state; } public void setState(State s){ state = s; } public void (){ state.Handle(this); }}
static void main(String[] args){ Context c = new Context(new ContextStateA()); c.Request(); c.Request();}
举个例子,一个人上班期间,根据时间的不同,对应不同的工作状态,那么按照平常的思路就是输入时间,一一去判断,这样的话就会违背了开放-封闭原则,这个时候采用状态模式,把每个时间点对应的状态,创建成为一个类,那么再添加类或者修改。都不会影响其他时间点的状态。
package com.abings.statemodel.StateModel;/** * Created by HaomingXu on 2016/9/12. */public abstract class State { public abstract void workstate(Work work);}
package com.abings.statemodel.StateModel;import android.util.Log;/** * Created by HaomingXu on 2016/9/12. */public class AfternoonState extends State { @Override public void workstate(Work work) { if (work.getHour() < 17){ Log.i("Tag","当前时间:"+work.getHour()+",下午工作,状态不错,继续努力。"); }else{ work.setState(new EveningState()); work.writeProgram(); } }}
package com.abings.statemodel.StateModel;import android.util.Log;/** * Created by HaomingXu on 2016/9/12. */public class NoonState extends State { @Override public void workstate(Work work) { if (work.getHour() < 14){ Log.i("Tag","当前时间:"+work.getHour()+",中午工作,饿了,犯困。"); }else{ work.setState(new AfternoonState()); work.writeProgram(); } }}
package com.abings.statemodel.StateModel;import android.util.Log;/** * Created by HaomingXu on 2016/9/12. */public class ForenoonState extends State { @Override public void workstate(Work work) { if (work.getHour() < 12){ Log.i("Tag","当前时间:"+work.getHour()+",上午工作,精神百倍。"); }else{ work.setState(new NoonState()); work.writeProgram(); } }}
package com.abings.statemodel.StateModel;import android.util.Log;/** * Created by HaomingXu on 2016/9/12. */public class EveningState extends State { @Override public void workstate(Work work) { if (work.isFinished()){ Log.i("Tag","当前时间:"+work.getHour()+",完成了。回家吧。"); }else{ if (work.getHour() < 21){ Log.i("Tag", "当前时间:" + work.getHour() + ",不行,没完成,继续加班。"); }else{ Log.i("Tag","当前时间:"+work.getHour()+",不行,没完成也要回家了。"); } } }}
package com.abings.statemodel.StateModel;/** * Created by HaomingXu on 2016/9/12. */public class Work { private State state; private int hour; private boolean isFinished = false; public boolean isFinished() { return isFinished; } public void setIsFinished(boolean isFinished) { this.isFinished = isFinished; } public int getHour() { return hour; } public void setHour(int hour) { this.hour = hour; } public Work(State state){ setState(state); } public State getState() { return state; } public void setState(State state) { this.state = state; } public void writeProgram(){ state.workstate(this); }}客户端
package com.abings.statemodel;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import com.abings.statemodel.StateModel.ForenoonState;import com.abings.statemodel.StateModel.Work;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Work work = new Work(new ForenoonState()); //一天的工作 work.setHour(10); work.writeProgram(); work.setHour(12); work.writeProgram(); work.setHour(13); work.writeProgram(); work.setHour(15); work.writeProgram(); work.setHour(19); work.writeProgram(); work.setHour(21); work.setIsFinished(true); work.writeProgram(); }}运行结果
09-12 15:28:19.201 20503-20503/? I/Tag: 当前时间:10,上午工作,精神百倍。09-12 15:28:19.201 20503-20503/? I/Tag: 当前时间:12,中午工作,饿了,犯困。09-12 15:28:19.201 20503-20503/? I/Tag: 当前时间:13,中午工作,饿了,犯困。09-12 15:28:19.202 20503-20503/? I/Tag: 当前时间:15,下午工作,状态不错,继续努力。09-12 15:28:19.202 20503-20503/? I/Tag: 当前时间:19,不行,没完成,继续加班。09-12 15:28:19.202 20503-20503/? I/Tag: 当前时间:21,完成了。回家吧。代码地址:
https://github.com/SingleShu/StateModel
1 0
- 设计模式学习之路-状态模式
- 学习设计模式之状态模式
- 设计模式之状态模式学习
- 设计模式学习笔记之状态模式
- HeadFrist设计模式学习之状态模式
- 设计模式学习笔记之状态模式
- 设计模式学习之------State模式(状态模式)
- 设计模式学习-----状态模式
- 设计模式学习--状态模式
- 设计模式学习--状态模式
- 设计模式学习:状态模式
- 设计模式学习笔记之(状态设计模式)…
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- C/C++ 指针常量和常量指针
- SoapUI 测试REST API(接口测试)
- Spark下载和配置-Win7
- timer.schedule方法中参数详解
- Java回调函数的理解
- 设计模式学习之路-状态模式
- Altium Designer原理图元件和PCB元件互相定位
- 学习整理——Java设计模式
- CCF 201604-3 路径解析
- 习题10
- 调用第三方的接口
- 在MFC(VS2013)对话框中添加菜单
- Cordova开发-H5移动开发准则
- Spring学习笔记(一)IOC与Spring基础xml配置