03. 策略模式

策略模式:算法部分可以抽象成接口,用户根据需要选择对应的算法(策略)。以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;
}

输出:

模板实现策略模式

猜你喜欢

转载自blog.csdn.net/x_shuck/article/details/81459388
03.