Java设计模式百例 - 状态模式

2017-12-27  本文已影响0人  享学IT

本文源码见:https://github.com/get-set/get-designpatterns/tree/master/state

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

我们程序猿在码代码的时候由于不同的工作状态,可能写出质量不一的代码,并我们不是AI嘛。

例子

如果上述情况用代码来表述的话,我们来设计一下。

程序猿还是同一个人,但是同一个任务在不同的状态下,可能会达到不同的效果。

注意上边这句话,有两个“同一个”和两个”不同的“。

人和任务是相同的,是不变的部分;状态和效果是不同的,是变的部分。按照设计模式的套路,不变的和变化的是要分开来的,从而满足”开闭“原则,有利于扩展。

不变的是人(类Developer)和任务(方法Developer.develop()),变化的状态(类XxxState)作为Developer的成员变量能够随时切换看来就可以解决这个问题。

由于状态是变化的,因此需要不同的类XxxState来描述,其方法XxxState.develop()正好可以灵活实现不同状态下的工作效果。

完美!最后还有一个,按照设计模式的通常套路,同一类变化的类要抽象为接口或抽象类,并提供统一的接口方法,从而做到”面向接口“编程,以应对变化。

设计完毕,那就开工:

Developer.java

public class Developer {
    private State state;

    public Developer(State state) {
        this.state = state;
    }

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

    public void develop() {
        state.coding();
    }
}

Developer维护有State的引用,并提供setState(State)方法切换状态。

State.java

public interface State {
    void coding();
}

EffectiveState.java

public class EffectiveState implements State {
    public void coding() {
        System.out.println("高效码代码,偶有bug,人非圣贤嘛~");
    }
}

ExhaustedState.java

public class ExhaustedState implements State {
    public void coding() {
        System.out.println("加班熬夜码代码,专业写bug");
    }
}

TianRenHeYiState.java

public class TianRenHeYiState implements State {
    public void coding() {
        System.out.println("写代码进入天人合一境界,仿佛三头六臂,码神附体");
    }
}
状态类的抽象

不同的状态有不同的实现效果,通过State抽象出统一的接口。

测试一下:

Client.java

public class Client {
    public static void main(String[] args) {
        Developer developer = new Developer(new EffectiveState());
        developer.develop();
        developer.setState(new ExhaustedState());
        developer.develop();
        developer.setState(new TianRenHeYiState());
        developer.develop();
    }
}

使用DevelopersetState方法切换不同的状态,从而实现不同的操作:

高效码代码,偶有bug,人非圣贤嘛~
加班熬夜码代码,专业写bug
写代码进入天人合一境界,仿佛三头六臂,码神附体

总结

这就是状态模式,将不同的状态包装为不同的类,供其本体引用,从而实现灵活的状态切换。

看到这里其实感觉状态模式和策略模式很像,状态模式是将不同的状态对象作为成员变量给使用者(也称”环境“),策略模式是将不同的策略对象作为成员变量给使用者(也称”环境“)。其实二者还是有些使用上的区别的:

使用场景

注意事项

上一篇 下一篇

猜你喜欢

热点阅读