第16章《状态模式》

1、准确定义:

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。


2、解决的问题:

状态模式主要用于解决:当控制一个对象状态转换的表达式过于复杂时。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的逻辑简化。


3、优势:

将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。


4、适用场景:

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。


5、UML图:


6、例子:

6.1、场景:

人一天有4个工作状态,上午、中午、下午、晚上。这个四个时间段的工作状态都是不同的,也就是不同的时间决定了不同的工作状态。通过采用状态模式的设计思想,展现人一天的工作状态。

6.2、UML图:


6.3、code:

代码结构图如下:


代码具体实现:

package designmodel.sixteenthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/14 22:59
 * @ProjectName: JavaBaseTest
 */
public class AfterNoonState extends State {
    @Override
    void handler(Work work) {
        int curTime=work.time;
        if(curTime<=18){
            System.out.println("当前时间是:"+curTime+":00:00"+",效率一般的工作着");
        }else{
            work.setState(new NightState());
            work.working();
        }
    }
}

package designmodel.sixteenthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/14 22:49
 * @ProjectName: JavaBaseTest
 */
public class BeforeNoonState extends State {
    @Override
    void handler(Work work) {
        int currTime=work.time;
        if(currTime<12){
            System.out.println("当前时间是:"+currTime+":00:00"+",精力充沛的工作");
        }else{
            work.setState(new NoonState());
            work.working();
        }
    }
}

package designmodel.sixteenthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/14 23:12
 * @ProjectName: JavaBaseTest
 */
public class Client{
    //test
    public static void main(String[] args) {
        Work work=new Work();
        work.time=10;
        work.working();

        work.time=11;
        work.working();

        work.time=13;
        work.working();

        work.time=14;
        work.working();

        work.time=18;
        work.working();

        work.time=20;
        work.working();

        work.time=21;
        work.working();

        work.time=22;
        work.isFinished=true;
        work.working();
    }
}

package designmodel.sixteenthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/14 23:00
 * @ProjectName: JavaBaseTest
 */
public class NightState extends State{
    @Override
    void handler(Work work) {
        if(work.isFinished){
            System.out.println("今天工作已完成,准备回家~");
            return;
        }else{
            int curTime=work.time;
            System.out.println("当前时间是:"+curTime+":00:00,"+"继续加班,疲惫至极!!!");
        }
    }
}

package designmodel.sixteenthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/14 22:59
 * @ProjectName: JavaBaseTest
 */
public class NoonState extends State {
    @Override
    void handler(Work work) {
        int currTime=work.time;
        if(currTime<=13){
            System.out.println("当前时间是:"+currTime+":00:00"+",午饭后,休息中");
        }else{
            work.setState(new AfterNoonState());
            work.working();
        }
    }
}

package designmodel.sixteenthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/14 22:40
 * @ProjectName: JavaBaseTest
 */
public abstract class State {
    abstract void handler(Work work);
}

package designmodel.sixteenthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/14 22:43
 * @ProjectName: JavaBaseTest
 */
public class Work{
    //工作是否完成
    public boolean isFinished=false;
    //当前工作时间
    public int time;
    //工作状态
    private State state;
    Work(){
        state=new BeforeNoonState();
    }

    //设置工作状态
    public void setState(State state) {
        this.state = state;
    }

    //工作中
    public void working(){
        state.handler(this);
    }
}


参考书籍:《大话设计模式》-程杰

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值