设计模式的应用场景(15)--状态模式

状态模式

定义:把所有研究对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的子类。意图是一个对象在内部状态改变的时候,行为也改变。

优点:具体状态角色将具体状态和它对应的行为封装了起来,使得增加一种新状态很简单,不需要用复杂冗余的逻辑判断语句。

缺点:状态太多时,结构分散逻辑不太清楚。

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();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值