当前位置:网站首页 > Java教程 > 正文

java状态模式教程



状态之间不是解耦的,所以才说状态模式对“开闭原则”的支持并不好。

状态模式中类有状态,状态的修改会改变整个类行为。

策略没有状态,策略的选择由客户端决定。

public class StateTest { public static void main(String[] args) { System.out.println("=====状态模式====="); TrafficLight light = new TrafficLight(ColorEnum.GREEN); for (int i = 0; i < 4; i++) { System.out.println("当前状态[" + light.getState() + "]"); light.forward(); } } } /* 抽象状态类 */ interface LightColor { void forward(TrafficLight light); // 向前转换 } /* 具体状态枚举类 */ enum ColorEnum implements LightColor { GREEN { public void forward(TrafficLight light) { System.out.println("向前转换: 绿灯 => 黄灯"); light.setState(ColorEnum.YELLOW); // 状态切换为黄灯 } public String toString() { return "绿灯@" + this.hashCode(); } }, YELLOW { public void forward(TrafficLight light) { System.out.println("向前转换: 黄灯 => 红灯"); light.setState(ColorEnum.RED); // 状态切换为红灯 } public String toString() { return "黄灯@" + this.hashCode(); } }, RED { public void forward(TrafficLight light) { System.out.println("向前转换: 红灯 => 绿灯"); light.setState(ColorEnum.GREEN); // 状态切换为绿灯 } public String toString() { return "红灯@" + this.hashCode(); } }; public void forward(TrafficLight light) { throw new UnsupportedOperationException("Invalid forward!"); } } /* 主题类 */ class TrafficLight { private LightColor color; // 维持一个对抽象状态对象的引用 public TrafficLight(LightColor color) { this.color = color; } // 设置状态对象 public void setState(LightColor color) { this.color = color; } // 获取当前状态对象 public LightColor getState() { return color; } public void forward() { color.forward(this); } }

运行结果:

=====状态模式===== 当前状态[绿灯@] 向前转换: 绿灯 => 黄灯 当前状态[黄灯@] 向前转换: 黄灯 => 红灯 当前状态[红灯@] 向前转换: 红灯 => 绿灯 当前状态[绿灯@] 向前转换: 绿灯 => 黄灯

  • 上一篇: java47使用教程
  • 下一篇: 自动推断java教程
  • 版权声明


    相关文章:

  • java47使用教程2024-11-20 13:50:01
  • java app开发学习教程2024-11-20 13:50:01
  • 以太坊Java开发教程2024-11-20 13:50:01
  • java字节教程2024-11-20 13:50:01
  • java教程音频2024-11-20 13:50:01
  • 自动推断java教程2024-11-20 13:50:01
  • java喂养教程2024-11-20 13:50:01
  • 公众号开发教程java2024-11-20 13:50:01
  • java装饰模式教程2024-11-20 13:50:01
  • java项目实训教程2024-11-20 13:50:01