您的位置:首页 > 其它

MOOC清华《面向对象程序设计》第8章:邮件过滤器基本框架(采用责任链模式)

2017-09-21 12:25 399 查看
视频中的代码只是一个总体框架,许多细节的函数并没有实现,我暂时也想不出如何实现,先把视频中的代码手打一遍,贴在这里。

//main.cpp

#include <iostream>
#include "class.h"
using namespace std;

int main(int argc, char** argv) {
DefaultFilter f1(NULL);
BodyFilter f2(&f1);
TitleFilter f3(&f2);
SenderFilter f4(&f3);

Request *request = getRequest();
f4.handler(request);
if(request.isReject()){
cout << "Reject it. " << endl;
}
else{
cout << "Accept it. " << endl;
}
return 0;
}
//class.h

#ifndef class_h
#define class_h

#include <string>
using namespace std;

class MailRequest{
bool _reject;
public:
string getSender();
string getTitle();
string getBody();
string getAll();

void accept(){_reject = false;}
void reject(){_reject = true;}

bool isReject(){return _reject;}
};

class Handler{
Handler *_successor;
public:
Handler(Handler *successor):_successor(successor){}
virtual ~Handler(){}

virtual bool doHandle(MailRequest *request) = 0;
void handle(MailRequest *request){
if(!doHandle(request)){
if(_successor != NULL)
_successor -> handle(request);
}
}
};

class SenderFilter:public Handler{
public:
SenderFilter(Handler *successor):
Handler(successor){}

bool doHandle(MailRequest *request){
if(isWhite(request->getSender())){
request->accept();
return true;
}
if(isBlack(request->getSender())){
request->reject();
return true;
}
return false;
}
};

class TitleFilter:public Handler{
public:
TitleFilter(Handler *successor):
Handler(successor){}

bool doHandle(MailRequest *request){
if(!isValid(request->getTitle())){
request->reject();
return true;
}
return false;
}
};

class BodyFilter:public Handler{
string[] invalidTexts = {"XXX","XXXX"};
public:
BodyFilter(Handler *successor):Handler(successor){}
bool doHandle(MailRequest *request){
for(auto s:InvalidTexts){
if(request->getBody().find(s) != string::npos){
request->reject();
return true;
}
}
return false;
}
};

class DefaultFilter:public Handler{
public:
DefaultFilter(Handler *successor):Handler(successor){}
bool doHandle(MailRequest *request){
request->accept();
return true;
}
};

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐