设计学习笔记10:使用状态模式和策略模式解决实际问题的例子

使用状态模式和策略模式解决实际问题的例子

状态模式示例:自动售货机

假设有一个自动售货机,其状态可以是“空闲”、“选择商品”、“等待支付”和“支付完成”。状态模式将允许售货机根据当前状态来改变其行为。

#include <iostream>
#include <memory>

// 定义售货机的状态接口
class State {
public:
    virtual void insertMoney() = 0;
    virtual void selectProduct() = 0;
    virtual void dispenseProduct() = 0;
    virtual ~State() {}
};

// 定义具体的状态
class NoProductSelectedState : public State {
public:
    void insertMoney() override {
        std::cout << "Cannot insert money, please select a product first." << std::endl;
    }
    void selectProduct() override {
        std::cout << "Product selected. Please insert money." << std::endl;
    }
    void dispenseProduct() override {
        std::cout << "No product selected." << std::endl;
    }
};

class ProductSelectedState : public State {
public:
    void insertMoney() override {
        std::cout << "Money inserted. Please take your product." << std::endl;
    }
    void selectProduct() override {
        std::cout << "A product is already selected." << std::endl;
    }
    void dispenseProduct() override {
        std::cout << "Product dispensed. Enjoy!" << std::endl;
    }
};

// 售货机上下文
class VendingMachine {
    std::unique_ptr<State> state;
public:
    VendingMachine() : state(std::make_unique<NoProductSelectedState>()) {}

    void setState(std::unique_ptr<State> newState) {
        state = std::move(newState);
    }

    void insertMoney() {
        state->insertMoney();
    }

    void selectProduct() {
        state->selectProduct();
        setState(std::make_unique<ProductSelectedState>());
    }

    void dispenseProduct() {
        state->dispenseProduct();
    }
};

int main() {
    VendingMachine vm;
    vm.selectProduct(); // 选择商品
    vm.insertMoney();  // 投入货币
    vm.dispenseProduct(); // 领取商品
    return 0;
}

策略模式示例:排序算法

假设我们需要根据不同的条件对一组数据进行排序,比如按升序或降序排序。策略模式允许我们在运行时选择排序算法。

#include <iostream>
#include <vector>
#include <algorithm>

// 定义排序策略接口
class SortStrategy {
public:
    virtual void sort(std::vector<int>& data) = 0;
    virtual ~SortStrategy() {}
};

// 定义具体的排序策略
class AscendingSortStrategy : public SortStrategy {
public:
    void sort(std::vector<int>& data) override {
        std::sort(data.begin(), data.end());
    }
};

class DescendingSortStrategy : public SortStrategy {
public:
    void sort(std::vector<int>& data) override {
        std::sort(data.begin(), data.end(), std::greater<int>());
    }
};

// 排序上下文
class SortContext {
    SortStrategy* strategy;
public:
    SortContext(SortStrategy* strategy) : strategy(strategy) {}

    void setStrategy(SortStrategy* newStrategy) {
        strategy = newStrategy;
    }

    void executeSort(std::vector<int>& data) {
        strategy->sort(data);
    }
};

int main() {
    std::vector<int> data = {5, 3, 8, 1, 4};

    SortContext context(new AscendingSortStrategy());
    context.executeSort(data); // 升序排序
    for (int num : data) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    context.setStrategy(new DescendingSortStrategy());
    context.executeSort(data); // 降序排序
    for (int num : data) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这两个例子中,状态模式允许自动售货机根据当前状态改变其行为,而策略模式允许排序上下文根据需要改变排序算法。这些例子展示了设计模式如何在实际编程中提供灵活性和可维护性。


分享一个有趣的 学习链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值