状态模式(State),当一个对象的内在状态改变时允许改变其行为。这个对象看上去就像是改变了它的类一样。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
状态模式的好处:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。将特定的状态相关的行为都放到一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。
状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
类图:
举一个灯泡开关的例子,列出示例代码:
//package com.dlut.designpattern.state;
public class Lightbulb {
public State state=null;
public void setState(State s){
this.state=s;
}
public void showState(){
state.show();
}
public void switchState(){
if(OnState.class.isInstance(state)){
this.state=new OffState();
}else if(OffState.class.isInstance(state)){
this.state=new OnState();
}
}
}
abstract class State{
public abstract void show();
}
class OnState extends State{
@Override
public void show() {
System.out.println("灯泡状态:开启...");
}
}
class OffState extends State{
@Override
public void show() {
System.out.println("灯泡状态:关闭...");
}
}
测试类:
//package com.dlut.designpattern.state;
public class Test {
public static void main(String[] args) {
Lightbulb lightbulb=new Lightbulb();
lightbulb.setState(new OnState());
lightbulb.showState();
lightbulb.switchState();
lightbulb.showState();
}
}
执行结果:
灯泡状态:开启…
灯泡状态:关闭…
状态模式也是比较好理解的设计模式。当行为随着状态改变时,我们就可以愉快地使用状态模式来提升逼格了。^_^
参考: