使用状态模式和策略模式解决实际问题的例子
状态模式示例:自动售货机
假设有一个自动售货机,其状态可以是“空闲”、“选择商品”、“等待支付”和“支付完成”。状态模式将允许售货机根据当前状态来改变其行为。
#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;
}
在这两个例子中,状态模式允许自动售货机根据当前状态改变其行为,而策略模式允许排序上下文根据需要改变排序算法。这些例子展示了设计模式如何在实际编程中提供灵活性和可维护性。
分享一个有趣的 学习链接