zoukankan      html  css  js  c++  java
  • 设计模式--状态模式

    状态模式:

    允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

    状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

    适用场景:

    • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
    • 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

    组成:

    • context类:维护一个ConcreteState子类的实例,这个实例定义当前状态。
    • state接口: 定义一个接口以封装与Context的一个特定状态相关的行为。
    • ConcreteStates类:每一子类实现state与Context的一个状态相关的行为。

    类图:

    应用例子:

    比如一个简单的例子,起床了就去工作,工作完了就睡觉,睡起来了就起床,一直是个循环,动作依赖状态的三个状态的变化。

    程序代码:

    public class Context {
        private State state;
    
        public Context(State state) {
            this.state = state;
        }
        public void request(){
            state.handle(this);
        }
    
        public State getState() {
            return state;
        }
    
        public void setState(State state) {
            this.state = state;
        }
    }
    public interface State {
        void handle(Context context);
    }
    public class GetUpState implements State {
        @Override
        public void handle(Context context) {
            System.out.println("起床了");
            context.setState(new WorkState());
        }
    }
    public class SleepState implements State{
    
        @Override
        public void handle(Context context) {
            System.out.println("睡觉");
            context.setState(new GetUpState());
        }
    }
    public class WorkState implements State {
        @Override
        public void handle(Context context) {
            System.out.println("上班");
            context.setState(new SleepState());
        }
    }
    public class Test {
        public static void main(String[] args) {
            Context context = new Context(new GetUpState());
            context.request();
            context.request();
            context.request();
    
        }
    }

    效果图:

  • 相关阅读:
    Unix&Linux下常见的性能分析工具介绍
    理解Load Average做好压力测试
    cron 的配置和说明
    原生js模仿下拉刷新功能
    webpack初步了解
    数组的迭代方法
    webpack4
    反思面向对象
    C和lua的互相调用
    对Zookeeper的一些分析
  • 原文地址:https://www.cnblogs.com/foreverYoungCoder/p/7844511.html
Copyright © 2011-2022 走看看