零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 面向对象
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 设计模式
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ STL
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 技术杂谈
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 常用函数
一.状态模式简述
状态模式(State Pattern)是行为设计模式之一。当对象根据其内部状态改变其行为时,将使用状态设计模式。
二.状态模式模式结构
- Context(上下文):定义一个与 Client 交互的接口。它维护对 ConcreteState 对象的引用,可以用该对象来定义当前状态。
- State(抽象状态):定义接口,来声明每个 ConcreteState 应该做什么。
- ConcreteState(具体状态):为 State 中定义的方法提供实现。
三.状态模式优缺点
优点:
- 实现多态行为的好处是显而易见的,并且很容易添加状态来支持额外的行为。
- 在状态模式中,对象的行为是其状态中函数的结果,并且在运行时根据状态改变行为,这就消除了对
switch/case
或if/else
条件逻辑的依赖。 - 可以提高内聚性,因为状态特定的行为被聚合到具体的类中,这些类被放在代码中的一个位置。
缺点:
- 使用状态模式,必然会增加系统中类和对象的个数。
- 由于状态模式的结构与实现较为复杂,一旦使用不当,将会导致程序结构和代码的混乱。
- 若要添加新的状态,则需要修改负责转换的源代码,否则无法转换到新增的状态,而且修改某个状态的行为也要修改源代码。
四.状态模式适用场景
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
五.状态模式案例分析
交通信号灯 – 文明出行,从我做起。
红灯停,绿灯行,黄灯亮了等一等。
交叉路口红绿灯,指挥交通显神通;
绿灯亮了放心走,红灯亮了别抢行;
黄灯亮了要注意,人人遵守红绿灯。
可以看到,交通信号灯的状态流:红灯 -> 绿灯 -> 黄灯。。。实际上,就是各个状态之间的相互切换,这完全符合状态模式。
六.状态模式代码实现
1.创建上下文
上下文由 TrafficLights 表示,该类有一个 IState 变量,在构造中被初始化为 RedLight(红灯):
/************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): https://www.codersrc.com/archives/21597.html
//@File:C++ 设计模式 –状态模式
//@Time:2023/02/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/************************************************************************/
// context.h
#ifndef CONTEXT_H
#define CONTEXT_H
#include "concrete_state.h"
// 交通信号灯
class TrafficLights
{
public:
TrafficLights() { m_pState = new RedLight(this); }
void SetState(IState* state) { m_pState = state; }
void Request() { m_pState->Handle(); }
private:
IState* m_pState;
};
#endif // CONTEXT_H
注意: 在上下文提供的方法中,实际上使用的是 IState 的相应方法。
2.创建抽象状态
IState 有一个 Handle()
接口,用于改变状态:
七.猜你喜欢
- C++ 设计模式 – 单例模式
- C++ 设计模式 – 抽象工厂模式
- C++ 设计模式 – 工厂方法模式
- C++ 设计模式 – 享元模式
- C++ 设计模式 – 桥接模式
- C++ 设计模式 – 模版方法模式
- C++ 设计模式 – 访问者模式
- C++ 设计模式 – 备忘录模式
- C++ 设计模式 – 中介者模式
- C++ 设计模式 – 策略模式
- C++ 设计模式 – 职责链模式
- C++ 设计模式 – 状态模式
ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容