08 状态模式 state
红绿灯, 根据不同的状态有不同的行为
类似 策略模式, 一个接口封装的是策略,然后不同的策略(类)实现这个接口
这里是, 一个接口封装的是状态,然后不同的状态(类)实现这个接口
参考 设计模式重点版 常用 10 中的.
用于解决系统中复杂对象的状态转换, 需要多外输出不同的行为
主要对象
Context环境类, 聚合维护一个 State 对象,它定义了当前状态
State 一个接口: 封装了一个抽象行为 Handle()
ConcreteState 具体状态类, 每一个类封装了一个状态对应的行为(与 Context 的一个状态的相关行为).
举例: 一个 APP 抽奖获得
这样的话, 相当于每一个状态都是一个类.
代码有点麻烦, 还是用灯的例子吧
灯的例子, 开, 关 两种状态
package com.leon.design; public abstract class State { public abstract void switchButton(LightContext lc); } package com.leon.design; public class OnState extends State { @Override public void switchButton(LightContext lc) { System.out.println("现在light是开状态, 关闭了电灯..."); lc.currentState = lc.offState; } } package com.leon.design; public class OffState extends State { @Override public void switchButton(LightContext lc) { System.out.println("现在light是关闭状态, 打开了电灯..."); lc.currentState = lc.onState; } } package com.leon.design; public class LightContext { State currentState; State onState = new OnState(); State offState = new OffState(); public LightContext() { this.currentState = offState; } public void DoClike() { currentState.switchButton(this); } } package com.leon.design; public class StateClient { public static void main(String[] args) { LightContext lc = new LightContext(); for (int i = 0; i < 3; i++) { lc.DoClike(); } } }