状态模式详解

解决的问题:无限的if elseif else

基本版:

package state;

public class V1 {
    public static void main(String[] args) {
        SayHi sayhi = new SayHi();
        sayhi.setTime(1);
        sayhi.doAction();
        sayhi.setTime(9);
        sayhi.doAction();
        sayhi.setTime(16);
        sayhi.doAction();
        sayhi.setTime(20);
        sayhi.doAction();

    }
}

//打招呼的类
class SayHi {
    Integer time;

    public Integer getTime() {
        return time;
    }

    public void setTime(Integer time) {
        this.time = time;
    }

    public void doAction() {
        if((time >= 0 && time < 4) ||  (time >= 19 && time <= 24)) {
            System.out.println("晚上好!");
        }else if(time >= 4 && time < 12) {
            System.out.println("上午好!");
        }else if(time >= 12 && time < 19) {
            System.out.println("下午好!");
        }
    }
}


状态模式版本:

package state;

public class V2 {
    public static void main(String[] args) {
        SayHi2 sayhi = new SayHi2();
        sayhi.setTime(1);
        sayhi.doAction();
        sayhi.setTime(9);
        sayhi.doAction();
        sayhi.setTime(16);
        sayhi.doAction();
        sayhi.setTime(20);
        sayhi.doAction();
    }
}
//环境类 也就是存放状态的类
class SayHi2 {
    private Integer time;
    private State state;

    public SayHi2() {
        state = new EveningState();
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public Integer getTime() {
        return time;
    }

    public void setTime(Integer time) {
        this.time = time;
        this.setState(new EveningState());
    }

    public void doAction() {
        state.doAction(this);
    }
}

interface State {
    void doAction(SayHi2 sayHi2);
}

class EveningState implements State {

    @Override
    public void doAction(SayHi2 sayHi2) {
        if((sayHi2.getTime() >= 0 && sayHi2.getTime() < 4) ||  (sayHi2.getTime() >= 19 && sayHi2.getTime() <= 24)) {
            System.out.println("晚上好!");
        }else {
            sayHi2.setState(new MorningState());
            sayHi2.doAction();
        }
    }
}

class MorningState implements State {

    @Override
    public void doAction(SayHi2 sayHi2) {
        if(sayHi2.getTime() >= 4 && sayHi2.getTime() < 12) {
            System.out.println("上午好!");
        }else {
            sayHi2.setState(new AfternoonState());
            sayHi2.doAction();
        }
    }
}

class AfternoonState implements State {

    @Override
    public void doAction(SayHi2 sayHi2) {
        if(sayHi2.getTime() >= 12 && sayHi2.getTime() < 19) {
            System.out.println("下午好!");
        }else {
            System.out.println("我与您有时间差,不知道怎么向你打招呼");
        }
    }
}

状态接口uml图:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值