设计模式-行为型之状态模式
2015-09-06 23:08
190 查看
模式动机
很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性我们称之为状态。当这样的对象与外部事件产生交互时,其内部状态会随之改变,从而使其行为也发生对应的改变。比如人作为一个对象(Person),假设有一个属性叫做饥饿程度(hungerLevel),有一种行为叫吃饭(eat),当饥饿程度为“非常饿”时,我们吃饭时会“大吃一顿”,当饥饿程度为“很饱”时,我们吃饭时会“只吃一点点”,也就是说,我们吃饭的这个行为会因我们的饥饿程度的不同而不同。同时我们的饥饿程度还会随时发生转换。此时,我们便可以使用状态模式。模式定义
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式描述了对象状态的变化以及对象如何在每一种状态下表现出不同的行为模式结构
环境类:Context,定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态
抽象状态类:State,定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
具体状态类:ConcreteState,每一个具体状态类都实现了环境(Context)的一个状态所对应的行为
代码示例
我们知道HTTP有一个状态码,用来表示服务器的响应状态,不同的状态码对应了不同的响应。下面我们以此为例来演示状态模式如何工作。//抽象状态类 public abstract class AbstractState { public abstract void response(); }
//具体状态类 public class State_200 extends AbstractState{ @Override public void response() { System.out.println("200,请求成功"); } }
public class State_404 extends AbstractState{ @Override public void response() { System.out.println("404,您请求的资源不存在"); } }
public class State_502 extends AbstractState{ @Override public void response() { System.out.println("502,Bad Gateway"); } }
//环境类 public class Server { private int status = 200;//默认是200状态 private AbstractState state; private State_200 state_200 = new State_200(); private State_404 state_404 = new State_404(); private State_502 state_502 = new State_502(); public void handle(){ checkState(); state.response(); } //检查状态,负责状态转换,某些场景下我们需要把状态转换工作放到具体状态类中实现 private void checkState(){ if(status==200){ this.setState(state_200); }else if(status==404){ this.setState(state_404); }else if(status==502){ this.setState(state_502); } } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public AbstractState getState() { return state; } public void setState(AbstractState state) { this.state = state; } }
//客户端测试类 public class Client { public static void main(String[] args) { Server server = new Server(); server.handle();//200,请求成功 server.setStatus(404); server.handle();//404,您请求的资源不存在 server.setStatus(502); server.handle();//502,Bad Gateway } }
从上面的例子可以看出,当环境类Server的状态status发生变化时,对应的handle()会有不同的行为。
总结
状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状态,无论对于何种状态的对象,客户端都可以一致处理。相关文章推荐
- CSS3的布局学习
- hdu 5033 单调栈 ****
- ISO/IEC 9899:2011 条款6.4.4——常量
- 【嵌入式linux】(第三步):安装串口终端 (ubuntu安装minicom串口终端)
- 关于构造函数和this调用的思考
- C/C++基础知识:typedef用法小结
- 黑马程序员——JavaScript(上)
- define,const,static,extern在项目中的使用区分
- 程序猿必须要抽时间运动运动
- [转]DirectX and .NET[英]
- OC-不重复随机数
- iOS开发UI篇—懒加载
- 一个笔试题目
- 快速判断一个数能否被1、2、3、4、5、6、7、8、9、10、11、12、13、17、19、23等整除的规律总结
- iOS中的Cocoa框架大全
- Matlab基本语法和基本操作
- C++ 多态,虚函数
- 你不能||不需要||没必要讨好所有的客户!!
- html.ex.day02
- java.lang.UnsatisfiedLinkError: Couldn't load entryex from loader dalvik.system.