1, 策略模式
有很多实现同一功能的算法, 都可以一个个封装起来, 可以方便的替换.
比如选磁盘, 可以随机选, 可以循环, 可以根据磁盘剩余空间选...
class Algorithm
{
public:
virtual int PickDisk() = 0;
};
class RandomAlgorithm : public Algorithm
{
public :
int PickDisk() {return rand();}
};
class FreespaceAlgorithm : public Algorithm
{
public:
int PickDisk() {return max_free_space();}
};
class DiskManager
{
public:
DiskManager()
{
m_Algorithm = new RandomAlgorithm ;
}
int PickDisk() {return m_Algorithm->PickDisk();}
private:
Algorithm* m_Algorithm;
}
// sample
DiskManager manager;
manager.PickDisk();
上面的sample 有个不方便的地方就是不能很方便的使用其它种算法, 改进
enum AlgorithmType
{
RANDOM = 0,
SPACE
};
class DiskManager
{
public:
DiskManager(AlgorithmType type)
{
if (type == RANDOM)
m_Algorithm = new RandomAlgorithm;
else if (type == SPACE)
m_Algorithm = new FreespaceAlgorithm;
}
int PickDisk()
{
return m_Algorithm->PickDisk();
}
private:
Algorithm* m_Algorithm;
}
// sample
DiskManager manager(RANDOM);
manager.PickDisk();
2, 工厂模式
根据不同的需要生产/生成不同的产品/类. 其实上例sample2中的DiskManager 的constructor 就是一个简单工厂