设计模式之状态模式

小明一天天的可能有多个状态,比如高兴、狂怒、追小红、睡觉等。但是这些状态有时候不能随意的转换。比如正开心呢就不可能直接去睡觉,生气中也不会去追小红。如果写成程序以往就免不了用一堆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只能睡觉缓解心情。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值