当前位置:   article > 正文

第十三篇 : (State)状态模式_@state

@state
第十三篇:状态模式
定义
       GoF为状态模式给出的定义是:允许一个对象在其内部状态发生变化时改变自己的行为,该对象看起来好像你改变他的类型。

UML静态类图



使用案例
     有这样一个电子颜料版,他上面有个手柄,可以拉(pull)也可以推(push),每次操作,都会改变颜料的颜色,他们的变化关系如图所示


用传统的方式解决
  1. public void push(ColorState state){
  2. switch (state) {
  3. case RED:
  4. state=ColorState.GREEN;
  5. break;
  6. case GREEN:
  7. state=ColorState.BLUE;
  8. case BLUE:
  9. state=ColorState.RED;
  10. default:
  11. break;
  12. }
  13. }

          这段代码并没有什么不妥,我们知道,需求总是不停变化的,如果又有新的状态需要加入时,这时就得在push()方法中添加新的case分支语句,这就破坏了OCP原则【 OCP:一个好的设计应该能够容纳新的功能或者需求的添加,但是添加的方式不是通过改变现有的类(模块),而是通过添加新的类(模块)来完成的,也就是说,在设计的时候,所有软件组成的的实体包括接口、类、函数等...必须都是可以拓展的,但是拓展的方式不是通过修改现有的东西】,上面的颜色很少,如果业务逻辑复杂,一个case分支就会超过百行,代码就会变得很难阅读和维护。

采用状态模式进行解决

       从上图可以看出,在不同的颜色下pash(推)和pull(拉)操作颜色变化都是不一样的,例如:当颜色为red时pull状态就变成Green,而Green的pull时状态就变成Blue,
根据上面的UML图我们为此我们抽象出一个状态接口State,它定义了与状态相关的方法。PaintBoard类包涵pull()、push()两个方法,它把这两个操作委托给当前状态完成。

PaintBoard类如下
  1. public void push(ColorState state){
  2. switch (state) {
  3. case RED:
  4. state=ColorState.GREEN;
  5. break;
  6. case GREEN:
  7. state=ColorState.BLUE;
  8. case BLUE:
  9. state=ColorState.RED;
  10. default:
  11. break;
  12. }
  13. }


State接口代码如下
  1. public interface State {
  2. String getColor();
  3. void push(PaintBoard paintBoard);
  4. void pull(PaintBoard paintBoard);
  5. }


RedState类代码如下
  1. public class RedState implements State{
  2. @Override
  3. public String getColor() {
  4. return "RED";
  5. }
  6. @Override
  7. public void push(PaintBoard paintBoard) {
  8. paintBoard.setState(new GreenState());
  9. }
  10. @Override
  11. public void pull(PaintBoard paintBoard) {
  12. paintBoard.setState(new BuleState());
  13. }
  14. }


BuleState类代码如下
  1. public class BuleState implements State {
  2. @Override
  3. public String getColor() {
  4. return "BULE";
  5. }
  6. @Override
  7. public void push(PaintBoard paintBoard) {
  8. paintBoard.setState(new RedState());
  9. }
  10. @Override
  11. public void pull(PaintBoard paintBoard) {
  12. paintBoard.setState(new GreenState());
  13. }
  14. }


GreenState类代码如下
  1. public class GreenState implements State {
  2. @Override
  3. public String getColor() {
  4. return "GREEN";
  5. }
  6. @Override
  7. public void push(PaintBoard paintBoard) {
  8. paintBoard.setState(new BuleState());
  9. }
  10. @Override
  11. public void pull(PaintBoard paintBoard) {
  12. paintBoard.setState(new RedState());
  13. }
  14. }


测试代码如下
  1. public class StateTest {
  2. public static void main(String[] args) {
  3. PaintBoard paintBoard=new PaintBoard(new RedState());
  4. System.out.println(paintBoard.getColor());
  5. paintBoard.push();
  6. System.out.println(paintBoard.getColor());
  7. paintBoard.push();
  8. System.out.println(paintBoard.getColor());
  9. }
  10. }

这样,PaintBoard类的代码里就在也找不到条件分支语句啦,代码也更容易阅读。最重要的是如果以后要添加许多的状态,只要添加新的State接口的实现即可,符合OCP原则,我们知道软件维护是最麻烦的,在大型项目开发中,以后维护就变得相当的容易

























声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/256866
推荐阅读
相关标签
  

闽ICP备14008679号