策略模式:算法部分可以抽象成接口,用户根据需要选择对应的算法(策略)。以cache置换算法为例,代码如下:
/**
* @file cache.h
* @brief strategy
* @author timeshark
* @version 1.0
* @date 2018-08-06
*/
#ifndef CACHE_H
#define CACHE_H
#include <iostream>
using std::cout;
using std::endl;
class ReplaceAlgorithm {
public:
virtual void replace() = 0;
};
class LRU_ReplaceAlgorithm : public ReplaceAlgorithm {
public:
void replace() {
cout << "least recently used relpace algorithm" << endl;
}
};
class FIFO_ReplaceAlgorithm : public ReplaceAlgorithm {
public:
void replace() {
cout << "first in first out replace algorithm" << endl;
}
};
class Random_ReplaceAlgorithm : public ReplaceAlgorithm {
public:
void replace() {
cout << "random replace algorithm" << endl;
}
};
class Cache {
public:
Cache(ReplaceAlgorithm* ra) : _ra(ra) {}
~Cache() {
if (_ra) {
delete _ra;
}
}
void replace() {
_ra->replace();
}
private:
ReplaceAlgorithm* _ra;
};
#endif
/**
* @file main.cpp
* @brief strategy
* @author timeshark
* @version 1.0
* @date 2018-08-06
*/
#include "cache.h"
int main() {
Cache a(new LRU_ReplaceAlgorithm());
a.replace();
Cache b(new FIFO_ReplaceAlgorithm());
b.replace();
Cache c(new Random_ReplaceAlgorithm());
c.replace();
return 0;
}
输出:
改进:
用户并不需要知道具体策略对应的类,可以在构造函数的时候,传入枚举类型值,来表示不同的策略,代码如下:
/**
* @file cache.h
* @brief strategy
* @author timeshark
* @version 1.0
* @date 2018-08-06
*/
#ifndef CACHE_H
#define CACHE_H
#include <iostream>
using std::cout;
using std::endl;
enum RA {LRU, FIFO, RANDOM}; // algorithm tag
class ReplaceAlgorithm {
public:
virtual void replace() = 0;
};
class LRU_ReplaceAlgorithm : public ReplaceAlgorithm {
public:
void replace() {
cout << "least recently used relpace algorithm" << endl;
}
};
class FIFO_ReplaceAlgorithm : public ReplaceAlgorithm {
public:
void replace() {
cout << "first in first out replace algorithm" << endl;
}
};
class Random_ReplaceAlgorithm : public ReplaceAlgorithm {
public:
void replace() {
cout << "random replace algorithm" << endl;
}
};
class Cache {
public:
Cache(enum RA ra) {
if (ra == LRU) {
_ra = new LRU_ReplaceAlgorithm();
} else if (ra == FIFO) {
_ra = new FIFO_ReplaceAlgorithm();
} else if (ra == RANDOM) {
_ra = new Random_ReplaceAlgorithm();
} else {
cout << "no this algorithm" << endl;
}
}
~Cache() {
if (_ra) {
delete _ra;
}
}
void replace() {
_ra->replace();
}
private:
ReplaceAlgorithm* _ra;
};
#endif
/**
* @file main.cpp
* @brief strategy
* @author timeshark
* @version 1.0
* @date 2018-08-06
*/
#include "cache.h"
int main() {
Cache a(LRU);
a.replace();
Cache b(FIFO);
b.replace();
Cache c(RANDOM);
c.replace();
return 0;
}
策略模式也可以基于模板进行实现,代码实例如下:
/**
* @file cache.h
* @brief strategy
* @author timeshark
* @version 1.0
* @date 2018-08-06
*/
#ifndef CACHE_H
#define CACHE_H
#include <iostream>
using std::cout;
using std::endl;
class LRU_ReplaceAlgorithm {
public:
void replace() {
cout << "least recently used relpace algorithm" << endl;
}
};
class FIFO_ReplaceAlgorithm {
public:
void replace() {
cout << "first in first out replace algorithm" << endl;
}
};
class Random_ReplaceAlgorithm {
public:
void replace() {
cout << "random replace algorithm" << endl;
}
};
template <class RA>
class Cache {
public:
Cache() {}
~Cache() {}
void replace() {
_ra.replace();
}
private:
RA _ra;
};
#endif
/**
* @file main.cpp
* @brief strategy
* @author timeshark
* @version 1.0
* @date 2018-08-06
*/
#include "cache.h"
int main() {
Cache<LRU_ReplaceAlgorithm> a;
a.replace();
Cache<FIFO_ReplaceAlgorithm> b;
b.replace();
Cache<Random_ReplaceAlgorithm> c;
c.replace();
return 0;
}
输出: