JAVA设计模式之状态模式
2015-09-27 22:07
369 查看
上一篇学了策略模式,再来看状态模式,显得就很简单了,它和策略模式很相似,它同样属于对象型行为模式,
状态模式:当一个对象的内在状态改变时改变其行为,这个对象看起来就像改变了它的类一样。
状态模式的类图结构如下图:
在状态模式中,主要涉及了如下几个角色:
环境角色(也称上下文):定义客户端所感兴趣的接口,并且保留一个具体状态类的实例,这个具体状态类实例给出此环境对象的现有状态。
抽象状态角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。
具体状态角色:每一个具体状态类都实现了环境的一个状态所对应的行为:
下面举一个常见的例子:
断点下载的问题
在做下载功能的时候,有未下载,正在下载中,下载完成等,现在我们就以下载功能的状态作为例子。
状态模式的代码实现
抽象状态角色:
State.java:
public interface State { void downloadState(); }
具体状态角色未下载状态
DownloadStart.java
public class DownloadStart implements State{ @Override public void downloadState() { // 未下载 System.out.println("还未下载"); } }
具体状态角色下载中状态
Downloading.java
public class Downloading implements State{ @Override public void downloadState() { // 正在下载 System.out.println("正在下载"); } }
具体状态角色下载完成状态
Downloaded.java
public class Downloaded implements State{ @Override public void downloadState() { // 下载完成 System.out.println("下载完成"); } }
环境角色Context.java
public class Context { private State state = new DownloadStart(); public void setState(State state) { this.state = state; } public void downloadState(){ state.downloadState(); } }
Client.java
public class Client { public static void main(String[] args) { Context context = new Context(); context.downloadState(); context.setState(new Downloading()); context.downloadState(); context.setState(new Downloaded()); context.downloadState(); } }
测试结果输出:
还未下载
正在下载
下载完成
总结:
状态模式和策略模式的区别:
状态模式和策略模式觉够完全一样的,
但是他们的目的、实现、本质是完成不一样的。状态模式的行为是平行性的,所谓平行性,指的是各个状态的行为所处的层次是一样的,相互独立的,没有关联的。不可相互替换的,而策略模式的行为是平等的,是可以相互替换的。
状态模式的优缺点
优点:
避免了为判断状态而产生的巨大if -elseif语句,将对象行为交给状态类维护,对于上层程序而言,仅需要维护状态之间的转换规则。
缺点:
会导致默写系统有过多的具体状态类
好了,状态模式我们就学习到这里了。
相关文章推荐
- JAVA之工厂模式
- spring+mybatis整合时占位符无法读取jdbc.properties的问题
- 为什么我们用spring
- JAVA学习笔记-面向对象
- 【笔记】Spring MVC学习指南(六)转换器和格式化
- JAVA基础学习(十九)--IO流、FileWrite与FileReader
- Java学习心得
- Java线程同步小陷阱,你掉进去过吗?
- java.util.concurrent.locks与synchronized及其异同
- Java工具类(四) 判断数组/集合为空的工具类
- Spring Boot实践应用开发(5)
- 基于 Eclipse 平台的代码生成技术
- 论JAVA项目对头脑的锻炼程度
- Java工具类(三) 解析配置文件工具类
- JFreeChart(与Struts2整合)
- Java中转换流的相关用法
- netbeans表的录入与清除
- Spring事务编写
- 设计模式之单例模式(java)
- JAVAWEB学习