小明一天天的可能有多个状态,比如高兴、狂怒、追小红、睡觉等。但是这些状态有时候不能随意的转换。比如正开心呢就不可能直接去睡觉,生气中也不会去追小红。如果写成程序以往就免不了用一堆if else 来判断小明现在的情况。引入了状态模式情况就要好很多。
状态模式究竟是什么样子的呢?让我们来一探究竟吧
首先我们有一个表示状态的类这里就叫State,每种状态都继承了这个类。这个类里有着上下文角色和各个状态的方法
public abstract class State {
protected Context context ;
public void setContext(Context context){
this.context = context;
}
public abstract void happy();
public abstract void rage();
public abstract void chase();
public abstract void sleep();
}
在看上下文角色
public class Context {
public static final HappyState HAPPY_STATE = new HappyState();//快乐状态
public static final RageState RAGE_STATE = new RageState();//狂暴状态
public static final ChaseState CHASE_STATE = new ChaseState();//追女孩状态
public static final SleepState SLEEP_STATE = new SleepState();//睡觉状态
private State currentState;
public void setState(State state) {
currentState = state;
state.setContext(this);
}
public State getState() {
return currentState;
}
public void happy(){
currentState.happy();
}
public void chase(){
currentState.chase();
}
public void rage(){
currentState.rage();
}
public void sleep(){
currentState.sleep();
}
}
接下来看真实的各种状态
开心
public class HappyState extends State {
public void happy() {
System.out.println("Y(*_*)Y好开心");
}
public void rage() {
super.context.setState(Context.RAGE_STATE);
super.context.getState().rage();
}
public void chase() {
super.context.setState(Context.CHASE_STATE);
super.context.getState().chase();
}
public void sleep() {
//太开心了没法睡着
}
public String toString() {
return "开心";
}
}
狂暴
public class RageState extends State {
public void happy() {
//怎么可能什么都不干就变得开心呢?
}
public void rage() {
System.out.println("我现在特别生气!!!");
}
public void chase() {
//生气的时候是没有办法去追女孩的
}
public void sleep() {
//生气了只好去睡觉了
super.context.setState(Context.SLEEP_STATE);
super.context.getState().sleep();
}
public String toString() {
return "狂怒";
}
}
追小红
public class ChaseState extends State {
public void happy() {
//追到了自然很开心呀
super.context.setState(Context.HAPPY_STATE);
super.context.getState().happy();
}
public void rage() {
//追不到就变得狂暴了
super.context.setState(Context.RAGE_STATE);
super.context.getState().rage();
}
public void chase() {
System.out.println("小红小红我爱你");
}
public void sleep() {
//嘿嘿嘿?
super.context.setState(Context.SLEEP_STATE);
super.context.getState().sleep();
}
@Override
public String toString() {
return "追女孩";
}
}
睡觉
public class SleepState extends State {
public void happy() {
//睡醒了活力满满
super.context.setState(Context.HAPPY_STATE);
super.context.getState().happy();
}
public void rage() {
//谁睡醒了啥都没干就各种生气呀
}
public void chase() {
//从睡梦中就追女孩也不合适
}
public void sleep() {
System.out.println("zZ~呼噜呼噜");
}
public String toString() {
return "睡觉";
}
}
场景
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.setState(new HappyState());
System.out.println("现在的状态是:"+context.getState());
context.rage();
System.out.println("现在的状态是:"+context.getState());
context.chase();
System.out.println("现在的状态是:"+context.getState());
context.sleep();
System.out.println("现在的状态是:"+context.getState());
context.happy();
System.out.println("现在的状态是"+context.getState());
}
}
运行结果:
现在的状态是:开心
我现在特别生气!!!
现在的状态是:狂怒
现在的状态是:狂怒
zZ~呼噜呼噜
现在的状态是:睡觉
Y(_)Y好开心
现在的状态是开心
注意我狂怒的时候尝试追了一下小红但是状态并没有改变。因为生气的时候是不可以追女孩的。emm只能睡觉缓解心情。