1. 状态模式的核心价值与应用场景
在面向对象编程中,状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。这种模式通过将状态封装为独立的类,并将行为委托给当前状态对象来实现。
状态模式最典型的应用场景是那些具有复杂状态转换逻辑的系统。比如:
- 游戏开发中的角色状态管理(站立、奔跑、跳跃、攻击等)
- 网络协议栈的状态机实现(连接建立、数据传输、断开连接等)
- 工作流引擎中的流程状态控制(待处理、处理中、已完成等)
- 用户界面中的交互状态切换(编辑模式、预览模式、只读模式等)
与传统的if-else或switch-case实现相比,状态模式具有以下优势:
- 将状态相关的行为局部化,符合单一职责原则
- 状态转换逻辑更加清晰,避免了条件语句的嵌套
- 新的状态可以很容易地添加,符合开闭原则
- 状态对象可以被共享(如果它们没有内部状态)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 状态模式的基础实现
2.1 经典UML结构
状态模式的经典实现包含三个核心组件:
- Context(上下文):维护一个ConcreteState子类的实例,这个实例定义当前状态
- State(状态):定义一个接口以封装与Context的一个特定状态相关的行为
- ConcreteState(具体状态):实现与Context的一个状态相关的行为
cpp复制// 状态接口
class State {
public:
virtual void handle(Context* context) = 0;
virtual ~State() = default;
};
// 具体状态A
class ConcreteStateA : public State {
public:
void handle(Context* context) override;
};
// 具体状态B
class ConcreteStateB : public State {
public:
void handle(Context* context) override;
};
// 上下文
class Context {
State* state_;
public:
explicit Context(State* state) : state_(state) {}
void request() {
state_->handle(this);
}
void changeState(State* state) {
state_ = state;
}
};
2.2 基础实现示例
让我们看一个简单的交通灯状态转换示例:
cpp复制// 交通灯状态接口
class TrafficLightState {
public:
virtual void handle() = 0;
virtual ~TrafficLightState() = default;
};
// 红灯状态
class RedLightState : public TrafficLightState {
public:
void handle() override {
std::cout << "红灯亮 - 停止通行" << std::endl;
// 红灯30秒后转为绿灯
std::this_thread::sleep_for(std::chrono::seconds(30));
}
};
// 绿灯状态
class GreenLightState : public TrafficLightState {
public:
void handle() override {
std::cout << "绿灯亮 - 允许通行" << std::endl;
// 绿灯45秒后转为黄灯
std::this_thread::sleep_for(std::chrono::seconds(45));
}
};
// 黄灯状态
class YellowLightState : public TrafficLightState {
public:
void handle() override {
std::cout << "黄灯亮 - 准备停止" << std::endl;
// 黄灯5秒后转为红灯
std::this_thread::sleep_for(std::chrono::seconds(5));
}
};
// 交通灯上下文
class TrafficLight {
std::unique_ptr<TrafficLightState> currentState_;
public:
explicit TrafficLight(TrafficLightState* state) : currentState_(state) {}
void changeState(TrafficLightState* state) {
currentState_.reset(state);
}
void operate() {
while (true) {
currentState_->handle();
if (dynamic_cast<RedLightState*>(currentState_.get())) {
changeState(new GreenLightState());
} else if (dynamic_cast<GreenLightState*>(currentState_.get())) {
changeState(new YellowLightState());
} else if (dynamic_cast<YellowLightState*>(currentState_.get())) {
changeState(new RedLightState());
}
}
}
};
3. 状态模式的高级应用技巧
3.1 状态对象的共享与复用
在某些场景下,状态对象可能是无状态的(即不包含成员变量),这时我们可以使用单例模式来共享状态对象,避免不必要的对象创建和销毁。
cpp复制// 单例状态实现
class SingletonState : public State {
private:
static SingletonState* instance_;
SingletonState() = default;
public:
static SingletonState* getInstance() {
if (!instance_) {
instance_ = new SingletonState();
}
return instance_;
}
void handle(Context* context) override {
// 处理逻辑
context->changeState(OtherState::getInstance());
}
// 禁止拷贝和赋值
SingletonState(const SingletonState&) = delete;
SingletonState& operator=(const SingletonState&) = delete;
};
// 初始化静态成员
SingletonState* SingletonState::instance_ = nullptr;
3.2 使用模板实现静态多态
对于性能敏感的场景,我们可以使用CRTP(奇异递归模板模式)来实现静态多态,避免虚函数调用的开销。
cpp复制template <typename T>
class StateBase {
public:
void handle(Context* context) {
static_cast<T*>(this)->handleImpl(context);
}
};
class ConcreteStateX : public StateBase<ConcreteStateX> {
public:
void handleImpl(Context* context) {
// 具体实现
}
};
class ConcreteStateY : public StateBase<ConcreteStateY> {
public:
void handleImpl(Context* context) {
// 具体实现
}
};
template <typename State>
class ContextTemplate {
State state_;
public:
void request() {
state_.handle(this);
}
};
3.3 状态转换表的实现
对于复杂的状态转换逻辑,可以使用转换表来管理状态迁移,使转换规则更加清晰和可配置。
cpp复制// 状态枚举
enum class StateType {
STATE_A,
STATE_B,
STATE_C
};
// 事件枚举
enum class EventType {
EVENT_1,
EVENT_2,
EVENT_3
};
// 状态转换表项
struct Transition {
StateType current;
EventType event;
StateType next;
void (*action)(Context*);
};
// 转换表示例
const std::vector<Transition> transitionTable = {
{StateType::STATE_A, EventType::EVENT_1, StateType::STATE_B, [](Context*){ /* 动作A1 */ }},
{StateType::STATE_A, EventType::EVENT_2, StateType::STATE_C, [](Context*){ /* 动作A2 */ }},
{StateType::STATE_B, EventType::EVENT_3, StateType::STATE_A, [](Context*){ /* 动作B3 */ }},
// 其他转换规则...
};
class TableDrivenContext {
StateType currentState_;
public:
void handleEvent(EventType event) {
for (const auto& transition : transitionTable) {
if (transition.current == currentState_ && transition.event == event) {
transition.action(this);
currentState_ = transition.next;
return;
}
}
throw std::runtime_error("Invalid state transition");
}
};
4. 状态模式在实际项目中的应用案例
4.1 网络协议栈实现
在网络编程中,TCP协议的状态机是状态模式的经典应用。TCP连接可能处于以下状态之一:CLOSED、LISTEN、SYN_SENT、SYN_RECEIVED、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK、TIME_WAIT。
cpp复制class TcpState {
public:
virtual void open(TcpConnection* conn) = 0;
virtual void close(TcpConnection* conn) = 0;
virtual void acknowledge(TcpConnection* conn) = 0;
virtual ~TcpState() = default;
};
class TcpEstablished : public TcpState {
public:
void open(TcpConnection* conn) override {
// 已建立连接,再次打开无效
}
void close(TcpConnection* conn) override {
// 发送FIN,转移到FIN_WAIT_1状态
conn->sendFin();
conn->changeState(new TcpFinWait1());
}
void acknowledge(TcpConnection* conn) override {
// 处理ACK
}
};
class TcpFinWait1 : public TcpState {
public:
void open(TcpConnection* conn) override {
// 无效操作
}
void close(TcpConnection* conn) override {
// 已经正在关闭
}
void acknowledge(TcpConnection* conn) override {
// 收到ACK,转移到FIN_WAIT_2状态
conn->changeState(new TcpFinWait2());
}
};
// 其他状态类实现...
class TcpConnection {
TcpState* state_;
// 其他成员...
public:
TcpConnection() : state_(new TcpClosed()) {}
void changeState(TcpState* newState) {
delete state_;
state_ = newState;
}
void open() {
state_->open(this);
}
void close() {
state_->close(this);
}
void acknowledge() {
state_->acknowledge(this);
}
~TcpConnection() {
delete state_;
}
};
4.2 游戏角色状态管理
在游戏开发中,角色通常有多种状态,如站立、行走、奔跑、跳跃、攻击等。使用状态模式可以优雅地管理这些状态及其转换。
cpp复制class CharacterState {
public:
virtual void enter(Character* character) = 0;
virtual void update(Character* character, float deltaTime) = 0;
virtual void exit(Character* character) = 0;
virtual ~CharacterState() = default;
};
class IdleState : public CharacterState {
public:
void enter(Character* character) override {
character->setAnimation("idle");
}
void update(Character* character, float deltaTime) override {
if (character->isMoving()) {
character->changeState(new WalkState());
}
}
void exit(Character* character) override {
// 清理工作
}
};
class WalkState : public CharacterState {
public:
void enter(Character* character) override {
character->setAnimation("walk");
character->setMoveSpeed(2.0f);
}
void update(Character* character, float deltaTime) override {
if (!character->isMoving()) {
character->changeState(new IdleState());
} else if (character->isRunning()) {
character->changeState(new RunState());
}
character->move(deltaTime);
}
void exit(Character* character) override {
character->setMoveSpeed(0.0f);
}
};
// 其他状态类实现...
class Character {
CharacterState* currentState_;
// 其他成员...
public:
Character() : currentState_(new IdleState()) {
currentState_->enter(this);
}
void changeState(CharacterState* newState) {
currentState_->exit(this);
delete currentState_;
currentState_ = newState;
currentState_->enter(this);
}
void update(float deltaTime) {
currentState_->update(this, deltaTime);
}
~Character() {
delete currentState_;
}
// 其他方法...
};
5. 状态模式的优化与性能考量
5.1 内存管理优化
在频繁状态切换的场景中,状态对象的创建和销毁可能成为性能瓶颈。我们可以采用以下优化策略:
- 对象池技术:预先创建状态对象池,重复使用状态实例
- 栈式状态管理:允许状态压栈和弹栈,实现状态嵌套
- 状态缓存:使用享元模式共享无状态的状态对象
cpp复制// 状态对象池实现示例
class StatePool {
std::unordered_map<std::type_index, std::vector<std::unique_ptr<State>>> pool_;
public:
template <typename T>
T* acquire() {
auto& states = pool_[typeid(T)];
if (states.empty()) {
states.push_back(std::make_unique<T>());
}
auto ptr = states.back().get();
states.pop_back();
return dynamic_cast<T*>(ptr);
}
template <typename T>
void release(T* state) {
pool_[typeid(T)].push_back(std::unique_ptr<State>(state));
}
};
// 使用示例
StatePool pool;
auto stateA = pool.acquire<ConcreteStateA>();
// 使用stateA...
pool.release(stateA);
5.2 并发环境下的状态模式
在多线程环境中使用状态模式需要特别注意线程安全问题:
- 状态对象应该是无状态的或线程安全的
- 状态转换需要适当的同步机制
- 考虑使用原子操作或锁来保护状态变更
cpp复制class ThreadSafeContext {
std::mutex mutex_;
std::unique_ptr<State> state_;
public:
explicit ThreadSafeContext(State* initialState)
: state_(initialState) {}
void request() {
std::lock_guard<std::mutex> lock(mutex_);
state_->handle(this);
}
void changeState(State* newState) {
std::lock_guard<std::mutex> lock(mutex_);
state_.reset(newState);
}
};
5.3 状态模式与C++17/20新特性
现代C++提供了许多新特性可以增强状态模式的实现:
- 使用std::variant实现类型安全的状态管理
- 使用std::visit实现状态处理
- 使用协程简化异步状态管理
cpp复制// 使用std::variant实现状态模式
struct StateA {
void handle() { std::cout << "StateA handling\n"; }
};
struct StateB {
void handle() { std::cout << "StateB handling\n"; }
};
using State = std::variant<StateA, StateB>;
class VariantContext {
State state_;
public:
explicit VariantContext(State initialState) : state_(initialState) {}
void request() {
std::visit([](auto& state) { state.handle(); }, state_);
}
template <typename NewState>
void changeState() {
state_ = NewState{};
}
};
// 使用示例
VariantContext ctx(StateA{});
ctx.request(); // 输出 "StateA handling"
ctx.changeState<StateB>();
ctx.request(); // 输出 "StateB handling"
6. 状态模式与其他设计模式的结合
6.1 状态模式与策略模式
状态模式和策略模式在结构上非常相似,但它们的意图不同:
- 状态模式:状态改变导致行为改变,状态转换是模式的一部分
- 策略模式:策略选择通常由客户端决定,策略之间通常不相互转换
我们可以结合两者优势,创建更灵活的设计:
cpp复制// 策略化的状态模式实现
class AdvancedContext;
class AdvancedState {
public:
virtual void enter(AdvancedContext* context) = 0;
virtual void execute(AdvancedContext* context) = 0;
virtual void exit(AdvancedContext* context) = 0;
virtual bool canTransitionTo(const std::string& stateName) const = 0;
virtual ~AdvancedState() = default;
};
class AdvancedContext {
std::unordered_map<std::string, std::unique_ptr<AdvancedState>> states_;
AdvancedState* currentState_;
public:
void addState(const std::string& name, AdvancedState* state) {
states_[name].reset(state);
}
void transitionTo(const std::string& stateName) {
if (currentState_ && !currentState_->canTransitionTo(stateName)) {
throw std::runtime_error("Invalid state transition");
}
auto it = states_.find(stateName);
if (it == states_.end()) {
throw std::runtime_error("Unknown state");
}
if (currentState_) {
currentState_->exit(this);
}
currentState_ = it->second.get();
currentState_->enter(this);
}
void execute() {
if (currentState_) {
currentState_->execute(this);
}
}
};
6.2 状态模式与观察者模式
将观察者模式与状态模式结合,可以在状态改变时通知其他对象:
cpp复制class StateObserver {
public:
virtual void onStateChanged(const std::string& newState) = 0;
virtual ~StateObserver() = default;
};
class ObservableContext {
std::vector<StateObserver*> observers_;
State* currentState_;
void notifyStateChanged(const std::string& stateName) {
for (auto observer : observers_) {
observer->onStateChanged(stateName);
}
}
public:
void addObserver(StateObserver* observer) {
observers_.push_back(observer);
}
void removeObserver(StateObserver* observer) {
observers_.erase(std::remove(observers_.begin(), observers_.end(), observer),
observers_.end());
}
void changeState(State* newState) {
currentState_.reset(newState);
notifyStateChanged(typeid(*newState).name());
}
};
6.3 状态模式与命令模式
将命令模式与状态模式结合,可以将状态转换封装为命令对象:
cpp复制class StateChangeCommand : public Command {
Context* context_;
State* newState_;
public:
StateChangeCommand(Context* context, State* newState)
: context_(context), newState_(newState) {}
void execute() override {
context_->changeState(newState_);
}
void undo() override {
// 实现撤销逻辑需要保存之前的状态
}
};
// 使用示例
Context context(new StateA());
Command* cmd = new StateChangeCommand(&context, new StateB());
cmd->execute(); // 状态从A变为B
7. 状态模式的测试与调试技巧
7.1 单元测试策略
测试状态模式实现时,需要考虑以下方面:
- 每个状态类的独立行为
- 状态转换的正确性
- 边界条件和异常情况
cpp复制// 使用Google Test框架的示例
TEST(StatePatternTest, InitialState) {
Context ctx(new ConcreteStateA());
EXPECT_EQ(ctx.getStateType(), "ConcreteStateA");
}
TEST(StatePatternTest, StateTransition) {
Context ctx(new ConcreteStateA());
ctx.request(); // 应该触发状态转换
EXPECT_EQ(ctx.getStateType(), "ConcreteStateB");
}
TEST(StatePatternTest, InvalidTransition) {
Context ctx(new ConcreteStateA());
// 尝试非法操作
EXPECT_THROW(ctx.invalidOperation(), std::runtime_error);
// 确保状态未改变
EXPECT_EQ(ctx.getStateType(), "ConcreteStateA");
}
7.2 日志与追踪
在调试状态模式时,详细的日志记录非常重要:
cpp复制class LoggedState : public State {
protected:
void logTransition(const std::string& from, const std::string& to) {
std::cout << "State transition: " << from << " -> " << to << std::endl;
}
};
class LoggedConcreteStateA : public LoggedState {
public:
void handle(Context* context) override {
logTransition("StateA", "StateB");
context->changeState(new LoggedConcreteStateB());
}
};
class LoggedConcreteStateB : public LoggedState {
public:
void handle(Context* context) override {
logTransition("StateB", "StateA");
context->changeState(new LoggedConcreteStateA());
}
};
7.3 可视化状态机调试
对于复杂的状态机,可以使用可视化工具来辅助调试:
- 生成状态转换图(可以使用Graphviz等工具)
- 实现状态历史记录功能
- 添加断点条件基于特定状态转换
cpp复制class VisualDebugContext : public Context {
std::vector<std::string> stateHistory_;
public:
void changeState(State* newState) override {
stateHistory_.push_back(typeid(*newState).name());
Context::changeState(newState);
}
void dumpStateGraph() const {
std::cout << "State transition history:" << std::endl;
for (const auto& state : stateHistory_) {
std::cout << " - " << state << std::endl;
}
}
};
8. 状态模式的替代方案与比较
8.1 状态模式与条件语句
对于简单的状态机,使用if-else或switch-case可能更直接:
cpp复制// 使用switch-case实现简单状态机
enum class LightState { RED, GREEN, YELLOW };
class TrafficLight {
LightState state_ = LightState::RED;
public:
void change() {
switch (state_) {
case LightState::RED:
state_ = LightState::GREEN;
break;
case LightState::GREEN:
state_ = LightState::YELLOW;
break;
case LightState::YELLOW:
state_ = LightState::RED;
break;
}
}
};
何时选择状态模式而非条件语句:
- 状态数量较多(超过3-4个)
- 状态转换逻辑复杂
- 需要频繁添加新状态
- 状态行为差异较大
8.2 状态模式与状态表驱动
表驱动方法将状态转换规则存储在数据结构中:
cpp复制// 表驱动状态机实现
struct Transition {
int currentState;
int event;
int nextState;
void (*action)();
};
const Transition transitions[] = {
{0, 1, 1, []{ std::cout << "Transition 0->1\n"; }},
{1, 2, 2, []{ std::cout << "Transition 1->2\n"; }},
{2, 3, 0, []{ std::cout << "Transition 2->0\n"; }}
};
class TableDrivenFSM {
int currentState_ = 0;
public:
void handleEvent(int event) {
for (const auto& trans : transitions) {
if (trans.currentState == currentState_ && trans.event == event) {
trans.action();
currentState_ = trans.nextState;
return;
}
}
throw std::runtime_error("Invalid transition");
}
};
状态模式与表驱动方法的比较:
- 状态模式:更适合面向对象设计,状态行为复杂的情况
- 表驱动:更适合规则明确、状态转换简单的情况
8.3 状态模式与行为树
在游戏AI等领域,行为树是状态模式的替代方案:
cpp复制// 简化行为树节点
class BehaviorNode {
public:
virtual bool execute() = 0;
virtual ~BehaviorNode() = default;
};
// 选择器节点(OR逻辑)
class Selector : public BehaviorNode {
std::vector<std::unique_ptr<BehaviorNode>> children_;
public:
void addChild(BehaviorNode* child) {
children_.emplace_back(child);
}
bool execute() override {
for (auto& child : children_) {
if (child->execute()) {
return true;
}
}
return false;
}
};
// 序列节点(AND逻辑)
class Sequence : public BehaviorNode {
std::vector<std::unique_ptr<BehaviorNode>> children_;
public:
void addChild(BehaviorNode* child) {
children_.emplace_back(child);
}
bool execute() override {
for (auto& child : children_) {
if (!child->execute()) {
return false;
}
}
return true;
}
};
何时选择行为树而非状态模式:
- 需要更复杂的决策逻辑
- 需要行为组合和复用
- 需要动态调整行为优先级
9. C++状态模式的最佳实践
9.1 资源管理与RAII
在C++中实现状态模式时,应充分利用RAII原则管理资源:
cpp复制// 使用unique_ptr管理状态生命周期
class SafeContext {
std::unique_ptr<State> state_;
public:
explicit SafeContext(State* initialState) : state_(initialState) {}
void changeState(State* newState) {
state_.reset(newState);
}
// 禁止拷贝
SafeContext(const SafeContext&) = delete;
SafeContext& operator=(const SafeContext&) = delete;
// 允许移动
SafeContext(SafeContext&&) = default;
SafeContext& operator=(SafeContext&&) = default;
};
9.2 使用现代C++特性
利用现代C++特性可以写出更简洁、安全的状态模式实现:
cpp复制// 使用std::function和lambda
class FunctionalState {
std::function<void(Context*)> handler_;
public:
explicit FunctionalState(std::function<void(Context*)> handler)
: handler_(std::move(handler)) {}
void handle(Context* context) {
handler_(context);
}
};
// 使用示例
Context ctx(new FunctionalState([](Context* ctx) {
std::cout << "Handling state A" << std::endl;
ctx->changeState(new FunctionalState([](Context* ctx) {
std::cout << "Handling state B" << std::endl;
}));
}));
9.3 性能优化建议
对于性能关键的应用,可以考虑以下优化:
- 避免动态内存分配:在栈上预分配状态对象
- 使用静态多态:模板和CRTP模式
- 减少虚函数调用:将状态处理逻辑内联
- 使用位掩码表示简单状态
cpp复制// 基于位掩码的状态标志
class FlagsStateSystem {
uint32_t flags_ = 0;
public:
static constexpr uint32_t RUNNING = 0x01;
static constexpr uint32_t JUMPING = 0x02;
static constexpr uint32_t ATTACKING = 0x04;
bool isRunning() const { return flags_ & RUNNING; }
bool isJumping() const { return flags_ & JUMPING; }
bool isAttacking() const { return flags_ & ATTACKING; }
void startRunning() { flags_ |= RUNNING; }
void stopRunning() { flags_ &= ~RUNNING; }
// 其他状态操作方法...
};
10. 状态模式在大型项目中的架构设计
10.1 分层状态机
对于复杂系统,可以使用分层状态机(HFSM)来管理状态层次结构:
cpp复制// 分层状态机实现
class HierarchicalState {
std::vector<std::unique_ptr<HierarchicalState>> children_;
HierarchicalState* parent_ = nullptr;
public:
void addChild(HierarchicalState* child) {
child->parent_ = this;
children_.emplace_back(child);
}
virtual void handle(HierarchicalContext* context) {
// 默认行为:尝试让子状态处理
for (auto& child : children_) {
child->handle(context);
}
}
virtual void enter(HierarchicalContext* context) {}
virtual void exit(HierarchicalContext* context) {}
};
class HierarchicalContext {
HierarchicalState* currentState_;
public:
void transitionTo(HierarchicalState* newState) {
if (currentState_) {
currentState_->exit(this);
}
currentState_ = newState;
currentState_->enter(this);
}
void handle() {
if (currentState_) {
currentState_->handle(this);
}
}
};
10.2 分布式状态管理
在分布式系统中,状态模式可以结合消息队列实现跨进程状态管理:
cpp复制// 分布式状态管理示例
class DistributedState {
public:
virtual void handleMessage(const Message& msg, DistributedContext* context) = 0;
virtual ~DistributedState() = default;
};
class DistributedContext {
std::unique_ptr<DistributedState> state_;
MessageQueue& queue_;
public:
DistributedContext(MessageQueue& queue) : queue_(queue) {}
void processMessages() {
while (auto msg = queue_.receive()) {
if (state_) {
state_->handleMessage(*msg, this);
}
}
}
void changeState(std::unique_ptr<DistributedState> newState) {
state_ = std::move(newState);
}
};
10.3 状态模式与领域驱动设计
在DDD中,状态模式可以很好地表示聚合根的状态变化:
cpp复制// DDD中的状态模式应用
class Order {
class State {
public:
virtual void confirm(Order* order) = 0;
virtual void cancel(Order* order) = 0;
virtual void ship(Order* order) = 0;
virtual ~State() = default;
};
class NewState : public State {
void confirm(Order* order) override;
void cancel(Order* order) override;
void ship(Order* order) override;
};
class ConfirmedState : public State {
void confirm(Order* order) override;
void cancel(Order* order) override;
void ship(Order* order) override;
};
// 其他状态类...
std::unique_ptr<State> state_;
public:
Order() : state_(new NewState()) {}
void confirm() {
state_->confirm(this);
}
void cancel() {
state_->cancel(this);
}
void ship() {
state_->ship(this);
}
void changeState(std::unique_ptr<State> newState) {
state_ = std::move(newState);
}
};
在实际项目中,我经常遇到状态模式被过度设计的情况。一个经验法则是:当状态转换逻辑开始变得复杂难以维护时,才考虑引入状态模式。对于简单的状态管理,条件语句可能更加直接和高效。另外,在设计状态接口时,要仔细考虑哪些方法应该放在状态接口中,避免创建过于庞大的接口。
