美文网首页
状态模式

状态模式

作者: zzj0990 | 来源:发表于2021-01-18 00:17 被阅读0次

    1. 概念

    状态模式是一种行为模式,在不同的状态下有不同的行为。

    2.使用场景

    考虑这样的一个场景:一个电梯,有四种操作:运行、停止、开门、关门。每一种操作成功后,都对应着状态的切换。每一种状态,又可以随着操作,向另一种状态切换。但是状态与状态之间又不是随意切换的。

    有箭头是允许的,没有箭头是不允许的。
    
    屏幕快照 2021-01-17 下午11.19.06.png

    3. 示例

    讲述的是一个MM处于不同的状态下(高兴/紧张/沮丧),不同动作(笑/说话)的表现。
    
    • 类图


      屏幕快照 2021-01-17 下午9.49.34.png
    • MMState - mm动作的抽象

    public abstract class MMState {
        abstract void smile();
        abstract void cry();
        abstract void say();
    }
    

    以下是三种不同状态下,其动作的表现

    • MMHappyState:
    // 高兴状态
    public class MMHappyState extends MMState {
        @Override
        void smile() {
            System.out.println("happy smile");
        }
        @Override
        void cry() {
            System.out.println("happy cry");
        }
        @Override
        void say() {
            System.out.println("happy say");
        }
    }
    
    • MMNervousState:
    // 紧张状态
    public class MMNervousState extends MMState {
        @Override
        void smile() {
        }
        @Override
        void cry() {
        }
        @Override
        void say() {
        }
    }
    
    • MMSadState:
    // 悲伤状态
    public class MMSadState extends MMState {
        @Override
        void smile() {
        }
        @Override
        void cry() {
        }
        @Override
        void say() {
        }
    }
    
    • MM:
    public class MM {
        String name;
        MMState state;
        public MM(MMState state){
            this.state = state;
        }
        public void smile() {
            state.smile();
        }
        public void cry() {
            state.cry();
        }
        public void say() {
            state.say();
        }
    }
    
    • 场景类:
    public static void main(String[] args) {
            MM m = new MM(new MMHappyState());
            m.smile();
            m.cry();
            m.say();
        }
    
    输出:
    happy smile
    happy cry
    happy say
    

    4. 总结

    状态模式适用于动作(抽象方法)的数量是一定的情况下,不同状态时动作表现异同,如果动作的数量无法确定下来,那此模式不适合。
    另外该模式要与策略模式区别开:

    • 状态模式


      屏幕快照 2021-01-18 上午12.09.29.png

    在程序运行的过程中,策略与策略之间,是相互独立的,从而耦合度是比较松的。因为本身策略中封装的是一系列可以相互替换的算法,每一个策略是可以独立完成自己所要完成的工作的。
    上下文(Context)依赖于策略,而策略不依赖于上下文。因为策略在工作时,并不关心这个信息是谁发送过来的。

    • 策略模式


      屏幕快照 2021-01-18 上午12.09.41.png

    在程序运行的过程中,状态与状态之间。比如从A状态,过渡到B状态,A状态是需要获取一个B状态(至于到底怎么获取,创建也好,使用注册表也好,使用享元也好,这个就要看具体业务了)的状态对象的。所以状态与状态之间是互相依赖的,耦合度是比较紧的。
    上下文(Context)依赖于状态,而状态又依赖于上下文。比如从A状态,过渡到B状态,A状态先获取一个B状态,之后要找到上下文,把上下文的状态给修改掉。所以上下文下状态之间是互相依赖的,耦合度也是比较紧的。

    划重点-- 两者的区别就在于:策略模式是松耦合、状态模式是紧耦合。

    ————————————————————
    坐标帝都,白天上班族,晚上是知识的分享者
    如果读完觉得有收获的话,欢迎点赞加关注

    相关文章

      网友评论

          本文标题:状态模式

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