设计模式的应用场景(15)--状态模式
程序员文章站
2024-01-20 11:56:28
...
状态模式
定义:把所有研究对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的子类。意图是一个对象在内部状态改变的时候,行为也改变。
优点:具体状态角色将具体状态和它对应的行为封装了起来,使得增加一种新状态很简单,不需要用复杂冗余的逻辑判断语句。
缺点:状态太多时,结构分散逻辑不太清楚。
QQ的不同状态可以用状态模式来处理,包括离线,登录中,在线和忙碌。
首先设计一个抽象的状态类,定义不同状态要处理的动作。
public interface QQState {
void handle(QQ qq);
}
下面分别实现不同的状态类
public class BusyState implements QQState {
public void handle(QQ document) {
//QQ处在忙碌中应该处理代码
document.setState(new LeaveState());
System.out.println("QQ在忙碌中");
}
}
public class LeaveState implements QQState {
public void handle(QQ document) {
//离线状态应该处理代码
document.setState(new LoginingState());
System.out.println("QQ已离线");
}
}
public class LiningState implements QQState {
public void handle(QQ document) {
//QQ在线应该处理代码
document.setState(new BusyState());
System.out.println("QQ在线");
}
}
public class LoginingState implements QQState {
public void handle(QQ document) {
//登录中应该处理代码
document.setState(new LiningState());
System.out.println("QQ登录中");
}
}
然后定义QQ类来处理抽象状态类
public class QQ {
public QQ() {
state = new LeaveState();
}
private QQState state;
public QQState getState(){ return state; }
public void setState(QQState state){ this.state = state; }
public void handle() {
state.handle(this);
}
}
客户端的调用代码
public class Client {
public static void main(String[] argv) {
QQ qq = new QQ();
qq.setState(new LeaveState());
qq.handle();
qq.setState(new LoginingState());
qq.handle();
qq.setState(new LiningState());
qq.handle();
qq.setState(new BusyState());
qq.handle();
}
}