一、背景
相信大家都用过QQ,当我我们为在线状态的时候可以接收和发送消息,离线状态即发不了消息也收不到消息,离开状态只能接收消息。状态和行为紧密关联,如果我们要实现这样的场景怎么整?最直接了当的方法就是if else了,但是想过没有,如果新增了状态关联了新的行为,我们是不是得加if,或者说某个状态下的行为改变了,还得去修改该if 状态下的行为方法。这样非但程序的可阅读性会变得很差、可扩展性也会很弱。后期维护起来就会比较困难。
二、概念
状态模式:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。
三、代码实例
/**
* QQ状态抽象类
*/
abstract class QQState {
public abstract void sendMessage();
public abstract void acceptMessage();
}
/**
* 环境角色 状态切换类
*/
class Context {
private QQState qqState;
public void sendMessage() {
this.qqState.sendMessage();
}
public void acceptMessage() {
this.qqState.acceptMessage();
}
public QQState getQqState() {
return qqState;
}
public void setQqState(QQState qqState) {
this.qqState = qqState;
}
}
/**
* 在线状态
*
*/
class OnlineSate extends QQState {
@Override
public void sendMessage() {
System.out.println("OnlineSate:能发送消息!");
}
@Override
public void acceptMessage() {
System.out.println("OnlineSate:能接收消息!");
}
}
/**
* 离线状态
*
*/
class OfflineState extends QQState {
@Override
public void sendMessage() {
System.out.println("OfflineState:不能发送消息");
}
@Override
public void acceptMessage() {
System.out.println("OfflineState:不能接收消息");
}
}
/**
* 离开状态
*
*/
class LeaveState extends QQState {
@Override
public void sendMessage() {
System.out.println("LeaveState:不能发送消息");
}
@Override
public void acceptMessage() {
System.out.println("LeaveState:能接收消息!");
}
}
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context();
context.setQqState(new OnlineSate());
context.sendMessage();
context.acceptMessage();
context.setQqState(new OfflineState());
context.sendMessage();
context.acceptMessage();
context.setQqState(new LeaveState());
context.sendMessage();
context.acceptMessage();
}
}
四、总结
1.状态模式避免了大量的if else或者switch,提高了程序的可读及易维护性。
2.遵循了开闭原则,将各个状态转化为各个子类,若需添加新状态只需增加新的子类即可,若状态行为发生变化,只需修改对应子类的行为。