状态模式

2021-01-18  本文已影响0人  zzj0990

1. 概念

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

2.使用场景

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

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

3. 示例

讲述的是一个MM处于不同的状态下(高兴/紧张/沮丧),不同动作(笑/说话)的表现。
public abstract class MMState {
    abstract void smile();
    abstract void cry();
    abstract void say();
}

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

// 高兴状态
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");
    }
}
// 紧张状态
public class MMNervousState extends MMState {
    @Override
    void smile() {
    }
    @Override
    void cry() {
    }
    @Override
    void say() {
    }
}
// 悲伤状态
public class MMSadState extends MMState {
    @Override
    void smile() {
    }
    @Override
    void cry() {
    }
    @Override
    void say() {
    }
}
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. 总结

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

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

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

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

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

上一篇下一篇

猜你喜欢

热点阅读