行为型模式-策略模式

发布时间 2023-11-10 15:58:01作者: Qt小罗

1 什么是策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为,将算法的定义和使用代码分离开来。

策略模式通过定义一组算法类,并将它们封装在可互换的策略对象中,使得在调用代码中可以动态选择具体的算法实现。这样,客户端代码与具体算法的实现细节解耦,客户端只需关心选择合适的策略对象,而不必了解具体的算法。

2 举个例子

下面以一个简单的排序算法为例来说明策略模式的应用。假设我们有一个排序类 Sorter,它负责对一个整数数组进行排序。我们想在排序时能够动态地选择不同的排序算法,比如选择冒泡排序算法、插入排序算法或者快速排序算法。

首先,我们定义一个排序策略接口 SortStrategy,其中包含一个排序方法 sort:

class SortStrategy {
public:
    virtual void sort(vector<int>& arr) const = 0;
    virtual ~SortStrategy() {}
};

然后,我们创建具体的排序算法类,例如冒泡排序、插入排序和快速排序。它们实现了排序策略接口,并提供了不同的排序算法实现:

class BubbleSort : public SortStrategy {
public:
    void sort(vector<int>& arr) const override {
        cout << "Performing bubble sort." << endl;
        // 省略冒泡排序算法实现
    }
};

class InsertionSort : public SortStrategy {
public:
    void sort(vector<int>& arr) const override {
        cout << "Performing insertion sort." << endl;
        // 省略插入排序算法实现
    }
};

class QuickSort : public SortStrategy {
public:
    void sort(vector<int>& arr) const override {
        cout << "Performing quick sort." << endl;
        // 省略快速排序算法实现
    }
};

接下来,我们在排序类中引入策略模式,将排序算法委托给策略对象来执行。排序类具有一个策略对象成员变量,并提供设置策略的方法:

class Sorter {
private:
    SortStrategy* strategy;

public:
    Sorter(SortStrategy* strategy) : strategy(strategy) {}

    void setStrategy(SortStrategy* strategy) {
        this->strategy = strategy;
    }

    void performSort(vector<int>& arr) {
        strategy->sort(arr);
    }
};

在客户端代码中,我们可以通过创建不同的策略对象,并将其设置到排序类中来选择不同的排序算法:

int main() {
    vector<int> arr = {5, 2, 7, 1, 4};

    Sorter sorter(new BubbleSort());  // 使用冒泡排序算法
    sorter.performSort(arr);

    sorter.setStrategy(new InsertionSort());  // 使用插入排序算法
    sorter.performSort(arr);

    sorter.setStrategy(new QuickSort());  // 使用快速排序算法
    sorter.performSort(arr);

    return 0;
}

在上述示例中,我们通过创建不同的策略对象来选择不同的排序算法。在排序类 Sorter 的 performSort 方法中,调用了策略对象的 sort 方法来执行具体的排序算法。

3 总结

策略模式的优点在于它能够在运行时动态地选择具体算法的实现,提供了更灵活的扩展性和可维护性。它还提供了一种避免复杂的条件语句和多重分支的方式,通过组合和委托来完成不同的算法行为。