一.小结
- 定义:允许对象内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
- 优点:1.结构清晰,避免了过多的if-else,提高了系统的可维护性 2.将所有与某个状态有关的行为放到一个类中,遵循单一职责,很容易新增一个状态 3.封装性非常好,将状态变换放置到类的内部来实现,遵循开闭原则
- 缺点:状态有关的子类随着状态的增加而增加,可能导致子类太多
- 使用场景:1.行为随状态改变而改变的场景 2.条件、分支判断语句的替代者
- 通用UML图:
二.例子
周一到周五我们作为打工人努力工作,周末时作为肥宅享受生活,这两种不同的状态可以用状态模式进行模拟:
-
状态接口
public interface IState { // 自身状态对应的行为 void doing(); // 设置环境角色 void setContext(Context context); }
-
具体的状态子类
public class FightState implements IState { @Override public void doing() { System.out.println("fight"); } @Override public void setContext(Context context) { context.setState(this); } }
public class LazyState implements IState { @Override public void doing() { System.out.println("lazy"); } @Override public void setContext(Context context) { context.setState(this); } }
-
环境对象
public class Context { private IState state; public IState getState() { return state; } public void setState(IState state) { this.state = state; } public void doing() { state.doing(); } }
-
情景类
public class Client { public static void main(String[] args) { IState fight = new FightState(); IState lazy = new LazyState(); Context context = new Context(); context.setState(fight); context.doing(); } }