博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习之路-状态模式
阅读量:4165 次
发布时间:2019-05-26

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

状态模式,实时监测状态,当状态发生变化相应的也会进行一些更新。通过把各种状态转移逻辑分布到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,完成了。回家吧。
代码地址:

你可能感兴趣的文章
Java设计模式(2) - 工厂设计模式
查看>>
Java多线程(8) - 同步(并发)类容器详解(CopyOnWrite容器、ConcurrentMap容器、Queue队列容器)
查看>>
Java设计模式(3) - 多线程并发设计模式 - Future设计模式
查看>>
Java设计模式(5) - 多线程并发设计模式 - 生产者-消费者设计模式多种写法
查看>>
Java多线程(9) - 多线程 - 线程池详解与使用示例
查看>>
Java多线程(10) - 多线程 - CountDownLatch、CyclicBarrier、Semaphore使用示例详解
查看>>
Java多线程(11) - 多线程 - 锁详解:重入锁、公平锁、非公平锁、读写锁、不可重入锁、自旋锁、独享锁、共享锁、互斥锁、悲观锁、乐观锁、分段锁、偏向锁、轻量级锁、重量级锁、CAS算法原理
查看>>
Java网络编程(10) - Netty网络编程常见问题与疑问
查看>>
设置Django连接到Google Cloud SQL(MYSQL)
查看>>
爬虫: 基于Node.js的强大爬虫,能直接发布抓取的文章哦
查看>>
Django学习笔记 扩展User模型
查看>>
Django资料总结
查看>>
Android进阶系列-发布项目到Jcenter
查看>>
基于Zxing的二维码扫描解析库——ZxingPlus
查看>>
算法入门-程序设计入门
查看>>
java数据结构-数据结构的概述
查看>>
java -Math常用方法
查看>>
Android进阶系列-手写数据库框架
查看>>
算法入门-循环结构程序设计
查看>>
算法入门-数组和字符串
查看>>