天天看點

C++設計模式:攔截過濾器模式

作者:QT進階進階

攔截過濾器模式

攔截過濾器模式(Intercepting Filter Pattern)用于對應用程式的請求或響應做一些預處理/後處理。定義過濾器,并在把請求傳給實際目标應用程式之前應用在請求上。過濾器可以做認證/授權/記錄日志,或者跟蹤請求,然後把請求傳給相應的處理程式。以下是這種設計模式的實體。

過濾器(Filter) - 過濾器在請求處理程式執行請求之前或之後,執行某些任務。

過濾器鍊(Filter Chain) - 過濾器鍊帶有多個過濾器,并在 Target 上按照定義的順序執行這些過濾器。

Target - Target 對象是請求處理程式。

過濾管理器(Filter Manager) - 過濾管理器管理過濾器和過濾器鍊。

用戶端(Client) - Client 是向 Target 對象發送請求的對象。

UML結構圖

C++設計模式:攔截過濾器模式

代碼實作

interface.h

建立抽象類 - 過濾器;建立實體類 - 身份驗證過濾器、調試過濾器

#include <string>
#include <iostream>
using namespace std;

class Filter	//基類-過濾器
{
public:
    Filter() {}
    virtual ~Filter() {}

    virtual void execute(string request) = 0;
};

class AuthenticationFilter: public Filter	//子類-身份驗證過濾器
{
public:
    void execute(string request)
    {
        cout << "Authenticating request: " + request << endl;
    }
};

class DebugFilter: public Filter	//子類-調試過濾器
{
public:
    void execute(string request)
    {
        cout << "request log: " + request << endl;
    }
};
           

target.h

建立目标類 Target

#include <string>
#include <iostream>
using namespace std;

class Target
{
public:
    void execute(string request)
    {
        cout << "Executing request: " + request << endl;
    }
};
           

filterchain.h

建立過濾器鍊

#include "target.h"
#include "interface.h"
#include <vector>

class FilterChain
{
public:
    FilterChain()
    {
        target = new Target();
    }

    void addFilter(Filter *filter)
    {
        filters.push_back(filter);
    }

    void execute(string request)
    {
        for (auto it : filters)
        {
            it->execute(request);
        }
        target->execute(request);
    }

    void setTarget(Target *target)
    {
        this->target = target;
    }

private:
    vector<Filter *> filters;
    Target *target;
};
           

filtermanager.h

建立過濾管理器

QT開發交流+赀料君羊:714620761
#include "filterchain.h"

class FilterManager
{
public:
    FilterManager(Target *target)
    {
        filterChain = new FilterChain();
        filterChain->setTarget(target);
    }

    void setFilter(Filter *filter)
    {
        filterChain->addFilter(filter);
    }

    void filterRequest(string request)
    {
        filterChain->execute(request);
    }

private:
    FilterChain *filterChain;
};
           

client.h

建立用戶端類 Client

#include "filtermanager.h"

class Client
{
public:
    void setFilterManager(FilterManager *filterManager)
    {
        this->filterManager = filterManager;
    }

    void sendRequest(string request)
    {
        filterManager->filterRequest(request);
    }

private:
    FilterManager *filterManager;
};
           

main.cpp

執行個體應用 - 使用 Client 來示範攔截過濾器設計模式

#include "client.h"

int main()
{
    FilterManager *filterManager = new FilterManager(new Target());
    filterManager->setFilter(new AuthenticationFilter());
    filterManager->setFilter(new DebugFilter());

    Client *client = new Client();
    client->setFilterManager(filterManager);
    client->sendRequest("HOME");

    return 0;
}

運作結果:
Authenticating request: HOME
request log: HOME
Executing request: HOME
           

繼續閱讀