美文网首页23种设计模式-java
State pattern-状态模式

State pattern-状态模式

作者: oneWeekOneTopic | 来源:发表于2018-06-08 10:39 被阅读10次

    解决问题

    主要解决由于状态不同而导致对象行为发生复杂变化(特别是多种行为发生变化),这时候如果仅通过if来处理,会使代码复杂度不可控。我们保以认为strategy模式更多的是解决不同状态下,单行为的变化;而state-pattern则是解决不同状态下多行为的变化。

    应用场景

    如果一个对象在不同的状态下,需要表现出不同的行为,这时候我们可以采用状态模式。一个非常经典的应用场景是状态机,它可以很好地描述状态机的变化;例如我们经常学到的电梯控制逻辑。

    原理图

    image

    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");
        }
    }
    @AllArgsConstructor
    public 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

    相关文章

      网友评论

        本文标题:State pattern-状态模式

        本文链接:https://www.haomeiwen.com/subject/kcbosftx.html