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

    人愤怒的时候会想打人,高兴的时候想笑,人的状态执行了不同的方法,程序也是一样,程序也有状态。当一个方法里需要多个if else来判断逻辑的时候就要注意到,当对象的状态很多时,程序会变得很复杂,而且添加新状态就会增加新的if else语句,大大违反了开闭原则

    我们可以使用状态模式,来为程序定义不同的状态时执行对应的动作。

    状态模式分为三个角色,环境,抽象状态,具体状态。环境类也称为上下文,定义了一些客户端经常使用的接口,维护一个状态。并将与状态有关的操作委托给相应状态对象来执行

    抽象状态

    abstract class State {
        public abstract void Handle(Context context);
    }

    具体状态A

    public class State1 extends State {
        @Override
        public void Handle(Context context) {
            System.out.println("执行状态A的动作");
            context.setState(new State2());
    
        }
    }

    具体状态B

    public class State2 extends State {
        @Override
        public void Handle(Context context) {
            System.out.println("B处理");
            context.setState(new State1());
        }
    }

    环境

    public class Context {
        State state;
        //初始状态
        public Context(State state){
    this.state=state;
        }
        public void setState(State state){
            this.state=state;
        }
    
        public State getState() {
            return state;
        }
        public void excute(){
            state.Handle(this);
        }
    }

    测试类

    public class Client {
        public static void main(String[] args) {
            Context context = new Context(new State1());
            context.excute();
            context.excute();
            context.excute();
            context.excute();
        }
    }

    总结:上述代码中,客户端是不知道状态的具体变化的。不同的状态执行了不同的动作。当然,可以在测试类里手动更改状态,也可以在具体状态类里更改状态。前者对客户端来说是已知的,后者则是未知的。

    应用场景:一个方法中中含有庞大的分支结构,并且这些分支决定于对象的状态时。或者一个对象执行动作的过程取决于它的行为,且必须在运行时根据状态改变行为时都可以考虑使用状态模式。

    不和别人一样,不复制只真正理解
  • 相关阅读:
    [Swift]LeetCode1035.不相交的线 | Uncrossed Lines
    [Swift]LeetCode1034.边框着色 | Coloring A Border
    [Swift]LeetCode1033. 移动石子直到连续 | Moving Stones Until Consecutive
    [Swift]美人征婚问题
    [Swift]动态变化顶部状态栏(statusBar)的颜色
    [Swift-2019力扣杯春季决赛]4. 有效子数组的数目
    [Swift-2019力扣杯春季决赛]3. 最长重复子串
    [Swift-2019力扣杯春季决赛]2. 按字典序排列最小的等效字符串
    转 ORA-12638: 身份证明检索失败
    转 构建镜像
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12793041.html
Copyright © 2011-2022 走看看