设计模式(019)行为型之状态模式

状态模式是一种行为型设计模式,它允许对象在内部状态发生变化时改变它的行为,使得对象在不同状态下有不同的行为表现,而且可以方便地添加新的状态而不必修改已有的代码。

1、场景设计

实现场景:对状态A和状态B做出不同的处理。

2、C++实现

`State` 是一个抽象基类,定义了状态的接口。`ConcreteStateA` 和 `ConcreteStateB` 分别是具体的状态类,实现了 `State` 接口。`Context` 类维护一个状态成员,可以在不同的状态下执行不同的行为。

cpp 复制代码
#include <iostream>

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

// 具体状态类A
class ConcreteStateA : public State {
    public:
        void handle() override {
            std::cout << "Handling state A" << std::endl;
        }
};

// 具体状态类B
class ConcreteStateB : public State {
    public:
        void handle() override {
            std::cout << "Handling state B" << std::endl;
        }
};

// 上下文类,维护一个状态成员,并在不同状态下执行不同的行为
class Context {
    private:
        State* state;

    public:
        Context(State* initial) : state(initial) {}

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

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

int main() {
    ConcreteStateA stateA;
    ConcreteStateB stateB;

    Context context(&stateA);
    context.request();

    context.setState(&stateB);
    context.request();

    return 0;
}

3、Java实现

`State` 接口定义了状态的行为。`ConcreteStateA` 和 `ConcreteStateB` 是具体的状态类,分别实现了 `State` 接口。`Context` 类维护一个状态成员,可以在不同的状态下执行不同的行为。在 `Main` 类中,我们创建了两个具体状态类的实例,并在 `Context` 中进行状态切换,并观察不同状态下的行为表现。

java 复制代码
package behavioralpattern.state;

// 状态接口
interface State {
    void handle();
}

// 具体状态类A
class ConcreteStateA implements State {
    @Override
    public void handle() {
        System.out.println("Handling state A");
    }
}

// 具体状态类B
class ConcreteStateB implements State {
    @Override
    public void handle() {
        System.out.println("Handling state B");
    }
}

// 上下文类,维护一个状态成员,并在不同状态下执行不同的行为
class Context {
    private State state;

    public Context(State initialState) {
        this.state = initialState;
    }

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

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

public class StateDemo {
    public static void main(String[] args) {
        ConcreteStateA stateA = new ConcreteStateA();
        ConcreteStateB stateB = new ConcreteStateB();

        Context context = new Context(stateA);
        context.request();

        context.setState(stateB);
        context.request();
    }
}
相关推荐
步行cgn18 小时前
适配器设计模式:一个“翻译官”的故事
设计模式
扶尔魔ocy21 小时前
【QT C++】常用设计模式
c++·设计模式
她说..1 天前
常见设计模式-观察者模式
java·spring boot·spring·观察者模式·设计模式
是2的10次方啊1 天前
设计模式与生活⑨:一碗胡辣汤,用不着认识十几种香料
设计模式
大江东去浪淘尽千古风流人物2 天前
【HexVIO】DSP卸载双目惯性VIO:Hexagon向量化前端与单帧融合调度深度解析
前端·状态模式·slam·dsp·vio·hexagon·移动端加速
geovindu2 天前
rust: Semaphore Pattern
开发语言·后端·设计模式·rust·代理模式·企业级信号量模式·同步型模式
是2的10次方啊2 天前
设计模式与生活⑧:快递到了,别一直刷物流
设计模式
吃一碗粉只付一碗钱2 天前
12-给SPA友好的401和403响应
c#·状态模式
sunlifenger3 天前
嵌入式部署,解锁张家港智慧灯杆的“极简组网”密码
科技·状态模式
raindayinrain3 天前
c++设计模式
开发语言·c++·设计模式