设计模式(十九)-- 状态模式
layout: post
title: 设计模式(十九)– 状态模式
description: 设计模式(十九)– 状态模式
categories:
- 设计模式
tags: - 设计模式
面向对象
状态模式
1.概述
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式
2.结构图
3.角色
Context(环境类):环境类又称为上下文类,它是拥有多种状态的对象。由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出去形成单独的状态类。在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。
State(抽象状态类):它用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象状态类中。
ConcreteState(具体状态类):它是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。
4.C语言实现
#include <stdio.h>
enum State
{
STATE_A,
STATE_B,
NUM_STATES
};
struct Object
{
const struct StateFunctions *state;
int x;
};
struct StateFunctions
{
void (*const func1)(struct Object *);
void (*const func2)(struct Object *);
};
static void stateAFunc1(struct Object *obj)
{
printf("State A, func1, x = %d\n", obj->x);
}
static void stateAFunc2(struct Object *obj)
{
printf("State A, func2, x = %d\n", obj->x);
}
static void stateBFunc1(struct Object *obj)
{
printf("State B, func1, x = %d\n", obj->x);
}
static void stateBFunc2(struct Object *obj)
{
printf("State B, func2, x = %d\n", obj->x);
}
static const struct StateFunctions stateFunctions[NUM_STATES] = {
{stateAFunc1, stateAFunc2},
{stateBFunc1, stateBFunc2},
};
static void changeState(struct Object *obj, enum State newState)
{
obj->state = &stateFunctions[newState];
}
int main()
{
struct Object obj = {&stateFunctions[STATE_A], 0};
obj.state->func1(&obj);
obj.state->func2(&obj);
changeState(&obj, STATE_B);
obj.state->func1(&obj);
obj.state->func2(&obj);
return 0;
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 开心大佬
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果