状态模式Demo

本文深入探讨了状态模式的设计理念,通过一个工作时间状态切换的例子,详细解释了如何使用状态模式来替代复杂的if-else语句,从而实现代码的清晰与高效。文章展示了状态模式的实现过程,包括抽象状态类、具体状态类以及上下文类的设计。
摘要由CSDN通过智能技术生成

状态模式:如果把一段可比较的长度作判断比较并多不同的事情(比如:某段时间干什么事),使用状态模式来替代多重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起来!

夜深了还扣毛码

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

 

 

转载于:https://my.oschina.net/u/3477913/blog/1490843

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值