您的位置:首页 > 编程语言 > Java开发

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语句,将对象行为交给状态类维护,对于上层程序而言,仅需要维护状态之间的转换规则。

缺点:

会导致默写系统有过多的具体状态类

好了,状态模式我们就学习到这里了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: