解决问题
主要解决由于状态不同而导致对象行为发生复杂变化(特别是多种行为发生变化),这时候如果仅通过if来处理,会使代码复杂度不可控。我们保以认为strategy模式更多的是解决不同状态下,单行为的变化;而state-pattern则是解决不同状态下多行为的变化。
应用场景
如果一个对象在不同的状态下,需要表现出不同的行为,这时候我们可以采用状态模式。一个非常经典的应用场景是状态机,它可以很好地描述状态机的变化;例如我们经常学到的电梯控制逻辑。
原理图
State:状态接口,定义多种行为接口,当然也可以处理一种行为,如上原理图-
ContreteSate:不同状态下的行为表现方式
-
Context:上下文,我们这里可以理解为为状态变化控制条件。
示例
以以下背景为例:
工人一日三餐,餐餐不同。
public interface MealState { public void drink(); public void eat();}public class BreakfastState implements MealState { public void drink() { System.out.println("drink milk"); } public void eat() { System.out.println("eat bread"); }}public class LunchState implements MealState { public void drink() { System.out.println("drink juice"); } public void eat() { System.out.println("eat noodle"); }}public class DinnerState implements MealState { public void drink() { System.out.println("drink wine"); } public void eat() { System.out.println("eat Steak"); }}@AllArgsConstructorpublic class Worker { @Setter private MealState state; public void haveAMeal() { state.drink(); state.eat(); } public static void main() { Worker context = new Worker(new BreakfastState()); context.haveAMeal(); context.setState(new LunchState()); context.haveAMeal(); context.setState(new DinnerState()); context.haveAMeal(); }}复制代码
参考
https://en.wikipedia.org/wiki/State_pattern