策略枚举是一种使用枚举(enum
)来封装策略模式的实践
策略枚举通常包括以下部分:
- 枚举类型:定义了一个枚举类型,其中每个枚举值代表一种策略。
- 策略函数:为每种策略定义一个函数,该函数实现具体的策略行为。
- 策略选择:根据枚举值来调用相应的策略函数。
优势:
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;
}