设计模式之状态模式

悠悠 2022-08-22 00:01 244阅读 0赞

状态模式定义:当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。

优点:

1、结构清晰,避免使用过多的switch……case或者if……else语句,避免程序的复杂性,提高系统的可维护性。

2、遵循设计原则,很好的体现了开闭原则和单一职责原则。

3、封装性非常好。

缺点:

如果子类太多,就会造成类膨胀的问题。

类图如下:

20160506223243783

实现代码如下:

context类:

  1. package com.designpatterns.state;
  2. /**
  3. * @author WSYW126
  4. * @version 创建时间:2016年4月14日 上午11:44:45
  5. * 类说明:Alljava
  6. */
  7. public class Context {
  8. public final static OpenState openState = new OpenState();
  9. public final static CloseState closeState = new CloseState();
  10. public final static RunState runState = new RunState();
  11. public final static StopState stopState = new StopState();
  12. public final static NOPowerState nOPowerState = new NOPowerState();
  13. private State state;
  14. public void run() {
  15. this.state.run();
  16. }
  17. public void stop() {
  18. this.state.stop();
  19. }
  20. public void open() {
  21. this.state.open();
  22. }
  23. public void close() {
  24. this.state.close();
  25. }
  26. public State getState() {
  27. return state;
  28. }
  29. public void setState(State state) {
  30. this.state = state;
  31. this.state.setContext(this);
  32. }
  33. }

liftState类:

  1. package com.designpatterns.state;
  2. /**
  3. * @author WSYW126
  4. * @version 创建时间:2016年4月14日 上午11:44:01
  5. * 类说明:Alljava
  6. */
  7. public abstract class State {
  8. protected Context context;
  9. public abstract void open();
  10. public abstract void close();
  11. public abstract void run();
  12. public abstract void stop();
  13. public abstract void noPower();
  14. public State() {
  15. }
  16. public Context getContext() {
  17. return context;
  18. }
  19. public void setContext(Context context) {
  20. this.context = context;
  21. }
  22. }

OpenState类:

  1. package com.designpatterns.state;
  2. /**
  3. * @author WSYW126
  4. * @version 创建时间:2016年4月14日 上午11:48:11 类说明:Alljava
  5. */
  6. public class OpenState extends State {
  7. @Override
  8. public void open() {
  9. System.out.println("电梯正在开门!");
  10. }
  11. @Override
  12. public void close() {
  13. super.context.setState(Context.closeState);
  14. super.context.getState().close();
  15. }
  16. @Override
  17. public void run() {
  18. System.out.println("请关门");
  19. }
  20. @Override
  21. public void stop() {
  22. }
  23. @Override
  24. public void noPower() {
  25. }
  26. }

stopState类:

  1. package com.designpatterns.state;
  2. /**
  3. * @author WSYW126
  4. * @version 创建时间:2016年4月14日 上午11:49:37
  5. * 类说明:Alljava
  6. */
  7. public class StopState extends State {
  8. @Override
  9. public void open() {
  10. super.context.setState(Context.openState);
  11. super.context.getState().open();
  12. }
  13. @Override
  14. public void close() {
  15. }
  16. @Override
  17. public void run() {
  18. super.context.setState(Context.runState);
  19. super.context.getState().run();
  20. }
  21. @Override
  22. public void stop() {
  23. System.out.println("正在停止!");
  24. }
  25. @Override
  26. public void noPower() {
  27. // TODO Auto-generated method stub
  28. }
  29. }

runState类:

  1. package com.designpatterns.state;
  2. /**
  3. * @author WSYW126
  4. * @version 创建时间:2016年4月14日 上午11:49:26 类说明:Alljava
  5. */
  6. public class RunState extends State {
  7. @Override
  8. public void open() {
  9. }
  10. @Override
  11. public void close() {
  12. }
  13. @Override
  14. public void run() {
  15. System.out.println("正在运行!");
  16. }
  17. @Override
  18. public void stop() {
  19. super.context.setState(Context.stopState);
  20. super.context.getState().stop();
  21. }
  22. @Override
  23. public void noPower() {
  24. }
  25. }

closeState类:

  1. package com.designpatterns.state;
  2. /**
  3. * @author WSYW126
  4. * @version 创建时间:2016年4月14日 上午11:49:15
  5. * 类说明:Alljava
  6. */
  7. public class CloseState extends State {
  8. public CloseState() {
  9. }
  10. @Override
  11. public void open() {
  12. super.context.setState(Context.openState);
  13. super.context.getState().open();;
  14. }
  15. @Override
  16. public void close() {
  17. System.out.println("正在关门!");
  18. }
  19. @Override
  20. public void run() {
  21. super.context.setState(Context.runState);
  22. super.context.getState().run();
  23. }
  24. @Override
  25. public void stop() {
  26. super.context.setState(Context.stopState);
  27. super.context.getState().stop();
  28. }
  29. @Override
  30. public void noPower() {
  31. }
  32. }

没电的状态类:

  1. package com.designpatterns.state;
  2. /**
  3. * @author WSYW126
  4. * @version 创建时间:2016年4月14日 上午11:49:48
  5. * 类说明:Alljava
  6. */
  7. public class NOPowerState extends State {
  8. public NOPowerState() {
  9. // TODO Auto-generated constructor stub
  10. }
  11. @Override
  12. public void open() {
  13. // TODO Auto-generated method stub
  14. }
  15. @Override
  16. public void close() {
  17. // TODO Auto-generated method stub
  18. }
  19. @Override
  20. public void run() {
  21. // TODO Auto-generated method stub
  22. }
  23. @Override
  24. public void stop() {
  25. // TODO Auto-generated method stub
  26. }
  27. @Override
  28. public void noPower() {
  29. // TODO Auto-generated method stub
  30. }
  31. }

测试类:

  1. package com.designpatterns.state;
  2. /**
  3. * @author WSYW126
  4. * @version 创建时间:2016年4月14日 下午12:11:48
  5. * 类说明:Alljava
  6. */
  7. public class Client {
  8. public static void main(String[] args) {
  9. Context context = new Context();
  10. context.setState(new CloseState());
  11. context.open();
  12. context.run();
  13. context.close();
  14. context.run();
  15. context.stop();
  16. }
  17. }

这就是状态模式。

参考资料
设计模式之禅

备注
转载请注明出处
http://blog.csdn.net/wsyw126/article/details/51335178
by WSYW126

发表评论

表情:
评论列表 (有 0 条评论,244人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式状态模式

    什么是设计模式 设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别

    相关 设计模式状态模式

    一.什么是状态模式? 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了这个类. 二.什么时候使用状态模式? 状态模式主要解决的是当控制

    相关 设计模式状态模式

    在软件开发过程中,应用程序中的部分对象可能会根据不同的情况作出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。 状态模式:对有

    相关 设计模式状态模式

    状态模式定义:当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。 优点: 1、结构清晰,避免使用过多的switch……case或者if……else语句,避

    相关 设计模式状态模式

    定义:又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看

    相关 设计模式状态模式

    . 模式定义 ​ 在很多情况下,一个对象的行为取决于它的一个或多个变化的属性,这些属性我们称之为状态,这个对象称之为状态对象。对于状态对象而已,它的行为依赖于它的状态,