设计模式(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();
    }
}
相关推荐
ThereIsNoCode1 小时前
「软件设计模式」状态模式(State)
设计模式·状态模式
天上掉下来个程小白1 小时前
案例-14.文件上传-简介
数据库·spring boot·后端·mybatis·状态模式
菜鸟一枚在这7 小时前
深入理解设计模式之代理模式
java·设计模式·代理模式
mjr9 小时前
设计模式-Java
java·设计模式
yuanpan9 小时前
23种设计模式之《组合模式(Composite)》在c#中的应用及理解
开发语言·设计模式·c#·组合模式
FLZJ_KL11 小时前
【设计模式】【创建型模式】单例模式(Singleton)
java·单例模式·设计模式
万兴丶14 小时前
Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)
数据结构·unity·设计模式·c#
菜鸟一枚在这14 小时前
深入剖析抽象工厂模式:设计模式中的架构利器
设计模式·架构·抽象工厂模式
码熔burning14 小时前
(三)趣学设计模式 之 抽象工厂模式!
设计模式·抽象工厂模式
程序猿多布15 小时前
C#设计模式 学习笔记
设计模式·c#