攔截過濾器模式
攔截過濾器模式(Intercepting Filter Pattern)用于對應用程式的請求或響應做一些預處理/後處理。定義過濾器,并在把請求傳給實際目标應用程式之前應用在請求上。過濾器可以做認證/授權/記錄日志,或者跟蹤請求,然後把請求傳給相應的處理程式。以下是這種設計模式的實體。
過濾器(Filter) - 過濾器在請求處理程式執行請求之前或之後,執行某些任務。
過濾器鍊(Filter Chain) - 過濾器鍊帶有多個過濾器,并在 Target 上按照定義的順序執行這些過濾器。
Target - Target 對象是請求處理程式。
過濾管理器(Filter Manager) - 過濾管理器管理過濾器和過濾器鍊。
用戶端(Client) - Client 是向 Target 對象發送請求的對象。
UML結構圖
代碼實作
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