阴晴圆缺 状态模式

2019-03-12  本文已影响0人  NazgulSun

今天说一说状态模式。

其实状态模式也是对于去除复杂的if else语句的一个有效的模式。

为什么 我们总是强调 要去掉 if else呢?

应为 if else 对于变化的封装是很差的。 如果有新的逻辑进来就需要 修改if else

这就违背了面向对象的OCP原则。

状态模式就是这样,设想有一个程序员对象,  他可以提供代码开发,测试,上线等功能。

但是这个对象 处于 繁忙, 空闲 等状态的时候,这几个功能会表现出不同的行为,

我们通常可以使用if else来实现,但现实中的问题,可能会比这个例子复杂的多。

比如在游戏中,对于一个英雄, 他可能会提供N个功能,可能会处于M个状态。

如果写if else 语句来处理,将会是一场灾难,而使用状态模式,结合状态机的转移设置,将会方便得多。

在java中,常用的另外一个例子是线程, 一个线程可以处于多个状态,不同状态下有自己的行为。

对于线程的实现方式可以使用状态模式来处理。

在状态模式中 对应一个context, 就是例子中的 人,英雄,线程, 每个context 对应一个state的接口的引用

这个接口是多态实现的,在很多网上的例子中,我看到 change state的方法,有的人是直接放在 state自己的逻辑里面,

我认为只有context才有全局的信息, state只需要一个 context 的引用,然后changeState的逻辑应该交给 context。

例如:

/**

* 加班的工作状态

*/

public class OvertimeState implements State {

    @Override

    public void doJob(Work work) {

        if(work.getHour() < 21){

            System.out.println("当前时间:" + work.getHour() + ",加班中");

        }else{

            //21点强制下班

            work.setState(new RestState());

            work.doJob();

        }

    }

}

加班的工作状态应该只关心加班的事情,

而不是要把 时间的逻辑加入加班状态中来,

这些事件的逻辑应该由程序员自己处理。

上一篇 下一篇

猜你喜欢

热点阅读