长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 创建型模式

  • 结构型模式

  • 行为型模式

    • 责任链模式(Chain of Responsibility Pattern)
    • 命令模式(Command Pattern)
    • 解释器模式(Interpreter Pattern)
    • 迭代器模式(Iterator Pattern)
    • 中介者模式(Mediator Pattern)
    • 备忘录模式(Memento Pattern)
    • 观察者模式(Observer Pattern)
    • 状态模式(State Pattern)
      • 概念
      • 思想
      • 角色
      • 优点
      • 缺点
      • 类图
      • 时序图
      • 示例代码
    • 策略模式(Strategy Pattern)
    • 模板方法模式(Template Method Pattern)
    • 访问者模式(Visitor Pattern)
  • 设计模式
  • 行为型模式
DC Wang
2023-05-28
目录

状态模式(State Pattern)

# 状态模式(State Pattern)

# 概念

状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为。它将对象的行为封装在不同的状态类中,使得对象在不同的状态下具有不同的行为,而不必使用大量的条件语句来判断当前状态。

# 思想

状态模式的思想是将对象的行为和状态分离,使得对象的状态变化对客户端透明。它通过定义表示不同状态的状态类,并将其封装在上下文类中,实现状态之间的切换和相应行为的触发。

# 角色

  • Context(上下文):定义客户端所感兴趣的接口,并维护一个具体状态类的实例,用于处理状态切换和行为的委托。
  • State(状态):定义一个接口或抽象类,用于封装与上下文相关的行为。
  • ConcreteState(具体状态):实现状态接口或抽象类,在不同状态下具体实现相应的行为。

# 优点

  • 将对象的状态和行为分离,使得状态转换更加灵活和可扩展。
  • 遵循开闭原则,易于增加新的状态类和行为。
  • 简化了大量的条件语句,提高了代码可读性和可维护性。

# 缺点

  • 增加了系统的类和对象的个数,增加了系统的复杂性。
  • 状态类的增加可能导致上下文类的复杂化。
  • 状态模式需要额外的结构代码,增加了系统的实现难度。

# 类图

@startuml

class Context {
  +request()
  -state: State
  +setState(state: State)
  +getState(): State
}

class State {
  +handle(context: Context)
}

class ConcreteStateA {
  +handle(context: Context)
}

class ConcreteStateB {
  +handle(context: Context)
}

Context --> State
Context --> ConcreteStateA
Context --> ConcreteStateB

note right of Context::state
  Current State
end note

note top of Context
  Client
end note

@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 时序图

@startuml

participant Client
participant Context
participant State

Client -> Context: request()
activate Context
Context -> State: handle()
activate State
State --> Context: handle()
deactivate State
deactivate Context

@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 示例代码

以下是一个简单的示例代码,使用C++实现状态模式的概念。假设有一个灯(Light)对象,它有两种状态:开(On)和关(Off)。根据不同的状态,灯的行为(比如开灯和关灯)将有所不同。

#include <iostream>

// 状态接口
class State {
public:
    virtual void handle() = 0;
};

// 具体状态类:开灯
class OnState : public State {
public:
    void handle() override {
        std::cout << "灯已经打开" << std::endl;
    }
};

// 具体状态类:关灯
class OffState : public State {
public:
    void handle() override {
        std::cout << "灯已经关闭" << std::endl;
    }
};

// 上下文类:灯
class Light {
private:
    State* state;

public:
    Light() {
        state = new OffState(); // 初始状态为关灯
    }

    void setState(State* newState) {
        state = newState;
    }

    void request() {
        state->handle();
    }
};

int main() {
    Light light;

    light.request(); // 输出:灯已经关闭

    light.setState(new OnState());
    light.request(); // 输出:灯已经打开

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

示例代码中定义了State接口和两个具体状态类OnState和OffState,以及上下文类Light。初始状态下,灯的状态是关灯(OffState)。通过调用setState方法可以改变灯的状态。request方法用于触发当前状态的行为。

代码运行结果:

灯已经关闭
灯已经打开
1
2

该示例演示了状态模式的基本原理,根据不同的状态,灯的行为发生了改变。

编辑 (opens new window)
#设计模式#行为型模式
上次更新: 2023/06/09, 13:17:31
观察者模式(Observer Pattern)
策略模式(Strategy Pattern)

← 观察者模式(Observer Pattern) 策略模式(Strategy Pattern)→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式