欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式的应用场景(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();
    }
}

相关标签: 设计模式