状态模式Demo

状态模式:如果把一段可比较的长度作判断比较并多不同的事情(比如:某段时间干什么事),使用状态模式来替代多重if --else if,需要有状态抽象类、状态实现类、做事情类

抽象状态类:

public abstract class State {
    public abstract void doit(Work work);
}

状态的实现类:

//早上
public class MorningState extends State {
    @Override
    public void doit(Work work) {
        if (work.getTime() < 12) {
            System.out.println("现在早上,感觉好精神!");
        } else {
            work.setState(new NoonState());
            work.doit();
        }
        System.out.println();
    }
}
//中午
public class NoonState extends State {
    @Override
    public void doit(Work work) {
        if (work.getTime() <= 12 ) {
            System.out.println("中午时间,吃顿饭再说!");
        } else {
            work.setState(new AfternoonState());
            work.doit(); // 把新建的状态拿去做判断
        }
    }
}
//下午
public class AfternoonState extends State {
    @Override
    public void doit(Work work) {
        if (17 > work.getTime()) {
            System.out.println("下午时间,困得一批啊");
        } else {
            work.setState(new EveningState());
            work.doit(); // 把新的状态传给要做的事情
        }
    }
}
//晚上+深夜
public class EveningState extends State {

    @Override
    public void doit(Work work) {
        if (work.getTime() < 23) {
            System.out.println("下班时间,high起来!");
        }else{
            System.out.println("夜深了还扣毛码");
        }
    }
}

做事情类:

public class Work {

    private State state;// 目前的状态
    private int time; // 时间,作为判断不同状态的依据

    public Work() {
        state = new MorningState(); // 初始状态
    }

    public int getTime() {
        return time;
    }

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

    public State getState() {
        return state;
    }

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

    public void doit() {
        state.doit(this); // 传递当前新实例给当前状态判断
    }
}

客户端:

public class Client {

    public static void main(String[] args) {
        Work w1 = new Work();
        w1.setTime(11);
        w1.doit();


        Work w2 = new Work();
        w2.setTime(12);
        w2.doit();

        Work w3 = new Work();
        w3.setTime(16);
        w3.doit();

        Work w4 = new Work();
        w4.setTime(19);
        w4.doit();

        Work w5 = new Work();
        w5.setTime(24);
        w5.doit();
    }
}

执行结果:

现在早上,感觉好精神!

中午时间,吃顿饭再说!

下午时间,困得一批啊

下班时间,high起来!

夜深了还扣毛码

状态模式:在一个类改变了自己内在的状态时候,对应的行为也会跟着改变;状态要需要有判断的依据,比如:时间;

猜你喜欢

转载自my.oschina.net/u/3477913/blog/1490843