(十七)状态模式-代码实现
2016-03-04 18:23
369 查看
介绍
首先明白两个单词:打开和关闭是同一个物体的两种状态,是需要经常互相切换的,不是没有关系的两个单词. let`s Go概念:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
应用场景:关闭着的门--》打开的门--》关闭的门,自动的切换到下一个状态的可执行事件。
好处:控制对象内部不同的状态执行不同的操作,按照状态流程执行。
典型的状态模式例子
代码:
//状态接口package note.com.state; /** * 状态接口定义 * @author lxz * */ public interface State { public State changeState(); public void doOne(); public void doTwo(); public void doThree(); }
//具体状态
package note.com.state; public class Open implements State{ public State changeState() { return new Connect(); } public void doOne() { System.out.println("事件一:打开状态执行"); } public void doTwo() { System.out.println("事件二:打开状态执行"); } public void doThree() { System.out.println("事件三:打开状态执行"); } }
package note.com.state; public class Connect implements State{ public State changeState() { return new Close(); } public void doOne() { System.out.println("事件一:连接状态执行"); } public void doTwo() { System.out.println("事件二:连接状态执行"); } public void doThree() { System.out.println("事件三:连接状态执行"); } }
package note.com.state; public class Close implements State{ public State changeState() { return new Open(); } public void doOne() { System.out.println("事件一:关闭状态执行"); } public void doTwo() { System.out.println("事件二:关闭状态执行"); } public void doThree() { System.out.println("事件三:关闭状态执行"); } }
//根据状态来执行具体操作的类
package note.com.state; public class Context { private State state = null; public Context(){ state = new Open(); } public State getState() { return state; } public void setState(State state) { this.state = state; } public void execute(){ state.doOne(); state.doTwo(); state.doThree(); state = state.changeState(); } }
//测试类
package note.com.state; public class StateTest { public static void main(String[] args) { Context context = new Context(); context.execute(); context.execute(); context.execute(); context.execute(); } }
结果:
事件一:打开状态执行
事件二:打开状态执行
事件三:打开状态执行
事件一:连接状态执行
事件二:连接状态执行
事件三:连接状态执行
事件一:关闭状态执行
事件二:关闭状态执行
事件三:关闭状态执行
事件一:打开状态执行
事件二:打开状态执行
事件三:打开状态执行
这个例子非常切合概念,有明显的状态内部的切换,有状态改变后的不同事件
相关文章推荐
- ubuntu 切换python3 和 python2
- PHP empty、isset、isnull的区别
- 【Java开发者自学笔记】前言
- Python argsort()
- C++中类所占内存空间的分析(转载)
- ASP.NET分页控件
- c# 动态设置控件位置
- php 36进制与10进制转换
- java并发编程实践学习(2)--对象的组合
- myeclipse无法找到JPEGImageEncoder问题
- c++学习
- 【转】c++继承:公有、私有、保护
- java学习笔记-java集合类
- 独特区间的编程
- C++入门学习——标准模板库之vector
- 关于java中static的应用及一种常见错误
- ASP.NET文件的上传下载提交分页
- 使用$.post 提交表单并且返回值方法
- matlab的reshape函数
- Eclipse中快捷键Ctrl + Alt + 向上箭头 或者 Ctrl + Alt + 向下箭头与Windows冲突