状态之间不是解耦的,所以才说状态模式对“开闭原则”的支持并不好。
状态模式中类有状态,状态的修改会改变整个类行为。
策略没有状态,策略的选择由客户端决定。
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); } }
运行结果:
=====状态模式===== 当前状态[绿灯@] 向前转换: 绿灯 => 黄灯 当前状态[黄灯@] 向前转换: 黄灯 => 红灯 当前状态[红灯@] 向前转换: 红灯 => 绿灯 当前状态[绿灯@] 向前转换: 绿灯 => 黄灯
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/17872.html