当前位置: 首页 > news >正文

小侃设计模式(廿一)-状态模式

1.概述

状态模式(State Pattern)是行为型设计模式的一种,它主要用来解决对象存在多种状态转换时,需要对外输出不同的行为。状态模式与策略模式有一定相似,区别在于策略模式行为彼此独立,可以进行相互替换;状态模式将对象状态封装在不同对象中,不同状态显示不同行为,不同状态之间可能有触发条件和先后关系。状态模式相较于策略模式而言,客户端不需要关心当前对象的状态,而策略模式需要在客户端根据状态选择调用策略类。本文将详述状态模式的原理及使用。

2.原理及使用

2.1 原理

状态模式的UML类图如下所示:
在这里插入图片描述
类图中主要包含三个元素:抽象状态角色(State)、具体状态角色(ConcreteState)、环境类角色(Context)。具体解释如下:

抽象状态角色(State):定义一个接口,封装环境对象中的特定状态所对应的行为,接口中可以有一个或多个行为;
具体状态角色(ConcreteState):是State的实现,定义了具体的行为,在不同的场景下进行状态切换;
环境类角色(Context):定义了一个接口,内部维护一个当前状态,根据不同的状态进行具体状态角色切换,产生不同行为。

2.2 案例

有一个MP3播放器,有开始、停止、下一首、上一首等功能,这里主要以开始和结束状态为准。
根据状态模式,画出UML类图如下:
在这里插入图片描述
编码如下:

public interface State {

    void print();

    void handle(Context context);

}

public class StartState implements State {

    @Override
    public void print() {
        System.out.println("Start ......");
    }

    @Override
    public void handle(Context context) {
        System.out.println("开始播放。。。");
        context.setState(this);
    }
}

public class StopState implements State {

    @Override
    public void print() {
        System.out.println("STOP ......");
    }

    @Override
    public void handle(Context context) {
        System.out.println("停止播放。。。");
        context.setState(this);
    }
}


public class Context {

    private State state;

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void handle() {
        state.handle(this);
    }
}

public class Client {

    public static void main(String[] args) {
        Context context = new Context();

        State startState = new StartState();
        startState.handle(context);
        System.out.print("当前状态:");
        context.getState().print();

        State stopState = new StopState();
        stopState.handle(context);
        System.out.print("当前状态:");
        context.getState().print();

    }
}

运行结果为:
在这里插入图片描述

2.3 优点和缺点

2.3.1 优点

1.代码有很强的可读性: 状态模式将每个状态的行为封装到对应的一个类中,使代码可读性更高;
2.方便维护: 避免大量的if…else语句,使代码更清晰一些;
3.符合开闭原则: 容易增加和删除状态。

2.3.1 缺点

1.容易造成类爆炸:当事件状态较多时,实现类会剧增;
2.容易造成代码混乱:当事件状态较多时,容易造成代码混乱;

3.小结

1.状态模式适用于行为随着状态而改变的场景,或者替换代码中存在的大量if…else语句;
2.状态模式能在一定程度上增加代码可读性。

4.参考文献

1.《设计模式之禅》-秦小波著
2.《大话设计模式》-程杰著
3.https://www.bilibili.com/video/BV1G4411c7N4-尚硅谷设计模式
4.https://www.runoob.com/design-pattern/observer-pattern.html

相关文章:

  • 深圳华强北网站建设/小程序设计
  • 网网站制作开发/新闻摘抄
  • 如何做企业网站建设/b站推广网站
  • 石家庄的建筑公司/seo 网站排名
  • 服饰品牌网站建设/百度推广深圳分公司
  • wordpress搬家菜单/网络推广怎么做好
  • 【机器学习之模型融合】Voting投票法简单实践
  • SpringBoot+2次MD5登录密码加密+MyBatisPlus+Thymeleaf+Bootstrap简单实现登录功能,一文轻松搞定!
  • linux / proc
  • Linux下安装Mysql8.0.11
  • 用Python的内置包Tkinter写一个练习系统4.0
  • LabVIEW使用VI脚本向VI添加对象
  • 35岁危机怎么破?
  • 【数据结构】保姆级单链表教程(概念、分类与实现)
  • 力扣刷题记录——507.完美数、509. 斐波那契数、520. 检测大写字母
  • 智云通CRM:为什么你总是在请客,但业绩却上不来?
  • dp(八)买卖股票的最好时机 (一,二、三)
  • 42. 【农产品溯源项目前后端Demo】后端-区块链连接服务