java 之 状态模式(大话设计模式)

看过大话设计模式的小伙伴,都知道大话设计模式中的demo代码不是JAVA的,对于编程来说,设计模式不限于任何语言,讲述的是编程的思想。

今天笔者再次看这篇文章时,看了下别人的博客对于设计模式的理解,希望能汲取点其中的核心思想,意外的是看到很多博客对状态模式理解的可能有些偏差。

正常来说,如果没有状态模式的情况下,我们会用一堆if else if或者 switch case来处理。寻找到正确的入口!这样的代码违背了单一原则,日后维护会牵一发而动全身。

使用状态模式能够很好的解决这个问题,来看下类图

大话设计模式-类图

再看下简单的笔者的例子:

/**
 * 抽象状态接口
 */
public interface State {

    public void WriteProgram(Work work);
}
/**
 * 上下文
 */
public class Work {

    private State state;

    private Integer hour;

    public Work() {
        state = new GoodMorning();
    }
    
    public void writeProgram() {
        state.WriteProgram(this);
    }

    public Integer getHour() {
        return hour;
    }

    public void setHour(Integer hour) {
        this.hour = hour;
    }

    public void setState(State state) {
        this.state = state;
    }
}
/**
 * 早晨状态 状态的一个分支
 */
public class GoodMorning implements State{

    @Override
    public void WriteProgram(Work work) {
        if (work.getHour() < 12) {
            System.out.println("工作状态很好啊");
        } else {
            work.setState(new AfterMorning());
            work.writeProgram();
        }

    }
}
/**
 * 状态的分支 下午状态
 */
public class AfterMorning implements State {

    @Override
    public void WriteProgram(Work work) {

        if (work.getHour() < 14) {
            System.out.println("有点困了");
        } else {
            work.setState(new Evening());
            work.writeProgram();
        }
    }
}
/**
 * 夜晚状态 状态的一个分支
 */
public class Evening implements State {

    @Override
    public void WriteProgram(Work work) {
        if (work.getHour() >= 19) {
            System.out.println("该下班了哦");
        }
    }

}

 

以上是笔者对状态模式的理解,如果需求有变更,增加某些状态,我们只需要在增加子类,如果是在中间插入状态,我们只需要改上一个状态的指向就可以了。

希望能帮助学习状态模式的小伙伴,不要生搬硬套设计模式,理解其精髓最重要!!!

posted @ 2017-12-07 16:20  红尾巴的猪  阅读(1140)  评论(0编辑  收藏  举报