设计模式——策略模式-策略枚举

策略枚举是一种使用枚举(enum)来封装策略模式的实践

策略枚举通常包括以下部分:

  1. 枚举类型:定义了一个枚举类型,其中每个枚举值代表一种策略。
  2. 策略函数:为每种策略定义一个函数,该函数实现具体的策略行为。
  3. 策略选择:根据枚举值来调用相应的策略函数。

优势:

1. 易于扩展:添加新的策略只需要增加新的枚举值和对应的策略函数。
2. 类型安全:枚举类提供了类型安全,避免了不同枚举值之间的混淆。

我们先来看一个java的策略枚举实例。

//策略枚举
public enum Calculator {
    //加法运算
    ADD("+"){
        public int exec(int a,int b){
        	return a+b;
        }
    },
    //减法运算
    SUB("-"){
        public int exec(int a,int b){
        	return a - b;
        }
    };
    String value = "";
    //定义成员值类型
    private Calculator(String _value){
    	this.value = _value;
    }
    //获得枚举成员的值
    public String getValue(){
    	return this.value;
    }
    //声明一个抽象函数
    public abstract int exec(int a,int b);
}

//场景类
public class Client {
    public static void main(String[] args) {
        //输入的两个参数是数字
        int a = Integer.parseInt(args[0]);
        String symbol = args[1]; //符号
        int b = Integer.parseInt(args[2]);
        System.out.println("输入的参数为:"+Arrays.toString(args));
        System.out.println("运行结果为:"+a+symbol+b+"="+Calculator.ADD.exec(a,b));
    }
}


下面是一个c++例子。c++不支持枚举值实现方法重写,因此可以为每个枚举值定义相应的枚举函数来完成

enum class SortStrategy {
    QuickSort,
    InsertionSort
};


//策略函数
void quickSort(std::vector<int>& data) {
    std::sort(data.begin(), data.end()); // 使用标准库中的快速排序实现
}

void insertionSort(std::vector<int>& data) {
    // 插入排序的实现
    for (size_t i = 1; i < data.size(); ++i) {
        int key = data[i];
        int j = i - 1;
        while (j >= 0 && data[j] > key) {
            data[j + 1] = data[j];
            --j;
        }
        data[j + 1] = key;
    }
}

//策略枚举
void sort(std::vector<int>& data, SortStrategy strategy) {
    switch (strategy) {
        case SortStrategy::QuickSort:
            quickSort(data);
            break;
        case SortStrategy::InsertionSort:
            insertionSort(data);
            break;
        // 可以继续添加其他排序策略
    }
}

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

    // 使用快速排序策略
    sort(data, SortStrategy::QuickSort);
    for (int value : data) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    // 使用插入排序策略
    data = {5, 3, 8, 4, 2}; // 重置数据
    sort(data, SortStrategy::InsertionSort);
    for (int value : data) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

上一篇:Python办公自动化之Word


下一篇:[Go语言快速上手]函数和包