设计模式之状态模式

设计模式之状态模式

状态模式
  当一个对象的内部状态改变时允许改变其行为,这个对象看起来就像是改变了其类一样
  状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时,把状态判断的逻辑转移到不同状态的一系列类当中,从而把复杂的逻辑判断简单化,
状态模式结构图
这里写图片描述


//一系列特定状态行为的接口
public abstract class State {

    public abstract void printfCurrentState(Work work);
}

//早上状态类
public class MorningState extends State {
    @Override
    public void printfCurrentState(Work work) {
        if (work.getTime() <= 12) {
            System.out.println("当前时间是早上工作状态");
        } else {
            work.setState(new NoonState());
            work.currentWorkState();
        }
    }
}

//中午状态类
public class NoonState extends State {

    @Override
    public void printfCurrentState(Work work) {
        if (work.getTime() <= 14) {
            System.out.println("当前时间是中午时间状态!");
        } else {
            work.setState(new AfternoonState());
            work.currentWorkState();
        }
    }
}
//下午状态类
public class AfternoonState extends State {
    @Override
    public void printfCurrentState(Work work) {
        if (work.getTime() <= 18) {
            System.out.println("当前时间是下午工作状态!");
            if (work.getTime() == 18) {
                work.setFinish(true);
            }
        } else {
            if(work.isFinish()) {
                work.setState(new WorkFinish());
                work.currentWorkState();
            } else {
                work.setState(new NightState());
                work.currentWorkState();
            }
        }
    }
}
//晚上实体类
public class NightState extends State {
    @Override
    public void printfCurrentState(Work work) {
        if(work.isFinish()) {
            work.setState(new WorkFinish());
            work.currentWorkState();
            return;
        }
        if (work.getTime() < 24 ) {
            System.out.println("现在是晚上加班时间工作状态");
        } else {
            if (work.getTime() >= 24)  {
                work.setTime(0);
            }
            work.setState(new EarlyState());
            work.currentWorkState();
        }
    }
}
//凌晨加班实体类
public class EarlyState extends State {
    @Override
    public void printfCurrentState(Work work) {
        if(work.isFinish()) {
            work.setState(new WorkFinish());
            work.currentWorkState();
            return;
        }
        if (work.getTime() <= 2) {
            System.out.println("现在是凌晨加班工作状态!已经坚持不住了!");
        } else {
            work.setState(new ForcedWork());
            work.currentWorkState();
        }
    }
}
//工作Context类
public class Work {

    private State state;

    private int time;

    private boolean isFinish;

    public boolean isFinish() {
        return isFinish;
    }

    public void setFinish(boolean finish) {
        isFinish = finish;
    }

    public Work(){
        time = 9;
        state = new MorningState();
    }

    public State getState() {
        return state;
    }

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

    public int getTime() {
        return time;
    }

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

    public void  currentWorkState(){
        System.out.print("当前时间是:" + time + "-----");
        state.printfCurrentState(this);
    }
}
//测试代码
public class EarlyState extends State {
    @Override
    public void printfCurrentState(Work work) {
        if(work.isFinish()) {
            work.setState(new WorkFinish());
            work.currentWorkState();
            return;
        }
        if (work.getTime() <= 2) {
            System.out.println("现在是凌晨加班工作状态!已经坚持不住了!");
        } else {
            work.setState(new ForcedWork());
            work.currentWorkState();
        }
    }
}
//测试客户端代码
public class TestMain {

    public static void main(String[] args) throws InterruptedException {
        Work work = new Work();
        for(int i = 9; i <= 24; i++) {
            work.setTime(i);
            work.currentWorkState();
            if (i == 24) {
                i = 0;
            }
            Thread.sleep(2000);
        }

    }
}

输出结果如下

这里写图片描述

总结

  

  状态模式的好处是减少大量的条件分支语句,而且减少了state类各个子类之间的依赖关系,
  当一个对象的行为取决于它的状态,并且必须是在运行时改变它的状态的时候,这个时候则可以考虑使用状态模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值