上一篇学了策略模式,再来看状态模式,显得就很简单了,它和策略模式很相似,它同样属于对象型行为模式,
状态模式:当一个对象的内在状态改变时改变其行为,这个对象看起来就像改变了它的类一样。
状态模式的类图结构如下图:
在状态模式中,主要涉及了如下几个角色:
- 环境角色(也称上下文):定义客户端所感兴趣的接口,并且保留一个具体状态类的实例,这个具体状态类实例给出此环境对象的现有状态。
- 抽象状态角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。
- 具体状态角色:每一个具体状态类都实现了环境的一个状态所对应的行为:
下面举一个常见的例子:
断点下载的问题
在做下载功能的时候,有未下载,正在下载中,下载完成等,现在我们就以下载功能的状态作为例子。
状态模式的代码实现
抽象状态角色:
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语句,将对象行为交给状态类维护,对于上层程序而言,仅需要维护状态之间的转换规则。
缺点:
会导致默写系统有过多的具体状态类
好了,状态模式我们就学习到这里了。