策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。----来自维基百科.
我写了一个很简单的策略模式,大概表示下其中用到的思想.
#include <stdio.h>
//定义了三种策略
void strategy_1(void){printf("策略1\n");}
void strategy_2(void){printf("策略2\n");}
void strategy_3(void){printf("策略3\n");}
void *strategy_func(void (*strategy)(void))//策略模式统一的访问接口
{
strategy();
}
int main()
{
void *pt = strategy_func(strategy_3);//使用方法可以直接用函数调用
void (*p)(void) = strategy_1;//也可以赋值使用
p();
return 0;
}
再来个实际应用的例子:
#include <stdio.h>
void print(int* a, int n)
{
for (int i=0; i<n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
int rule1(int x, int y)
{
return x - y;
}
int rule2(int x, int y)
{
return y - x;
}
int rule3(int x, int y)
{
return x%3 - y%3;
}
void sort(int* a, int n, int (*f)(int, int))
{
for (int i=0; i<n-1; i++) {
for (int j=0; j<n-i-1; j++) {
if (f(a[j], a[j+1])>0) {
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,0};
print(a, 10);
sort(a, 10, rule1);
print(a, 10);
sort(a, 10, rule2);
print(a, 10);
sort(a, 10, rule3);
print(a, 10);
return 0;
}