设计模式(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();
    }
}
相关推荐
繁华似锦respect4 小时前
C++ 智能指针底层实现深度解析
linux·开发语言·c++·设计模式·代理模式
繁华似锦respect11 小时前
单例模式出现多个单例怎么确定初始化顺序?
java·开发语言·c++·单例模式·设计模式·哈希算法·散列表
繁华似锦respect12 小时前
C++ 内存分配器-allocator
开发语言·c++·设计模式
Zaralike12 小时前
Java设计模式
java·开发语言·设计模式
开心香辣派小星13 小时前
23种设计模式-14迭代器模式
设计模式·迭代器模式
2301_8035545215 小时前
Pimpl(Pointer to Implementation)设计模式详解
c++·算法·设计模式
__万波__16 小时前
二十三种设计模式(七)--桥接模式
设计模式·桥接模式
老朱佩琪!16 小时前
在Unity中实现状态机设计模式
开发语言·unity·设计模式
达斯维达的大眼睛16 小时前
常用设计模式总结
设计模式
老朱佩琪!17 小时前
Unity建造者设计模式
设计模式