职责链模式和工厂模式混合求解一个简单的解密问题
2013-11-30 16:05
357 查看
#include "oj.h"
#include <stdlib.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <typeinfo>
#include <vector>
#include <memory>
using namespace std;
/* 功能:取得解密串
* 输入:intputstr :加密串
* 输出:pOutputstr:解密串
* 返回:解密成功返回0,否则返回-1
*/
/*
详细描述:
输入一篇加密后的字符串,输出解密后的字符串。
规则:
1.获得一段文字后,求出它的长度(包括空格)len。
2.进入加密运算的第1步:把所有下标是1倍数的字符做顺时针旋转。
3.进入加密运算的第2步:把所有下标是2倍数的字符做逆时针旋转。
4.进入加密运算的第3步:把所有下标是3倍数的字符做顺时针旋转。
5.按上面的规则,第奇数步按顺时针旋转,偶数步按逆时针旋转,一直到第len步为止。
例子:
比如原文是:abcde
1.获得长度len = 5
2.1的倍数有1、2、3、4、5,所以把这5个字符按顺时针旋转,得到eabcd。
3.2的倍数有2、4,所以把这2个字符按逆时针旋转,得到ecbad。
4.3的倍数有3,所以把这1个字符按顺时针旋转,得到ecbad。
5.4的倍数有4,所以把这1个字符按逆时针旋转,得到ecbad。
6.5的倍数有5,所以把这1个字符按顺时针旋转,得到ecbad。
最后的结果是ecbad。
*/
struct StManipulateStr
{
static string revert(string strInput,unsigned int factor)
{
unsigned int len=(strInput.size());
unsigned int msize=len/factor; // 5/2=2,5/3=1,5/4=1,5/5=1
if(msize<=1) return strInput;
try
{
char* temp1=new char[len+1];
char* temp2=new char[len+1];
memcpy(temp1,strInput.c_str(),size_t(len));
memcpy(temp2,strInput.c_str(),size_t(len));//输出延续输入
temp1[len]='\0';
temp2[len]='\0';
for(int i=1;i<=msize;i++)
{
temp2[i*factor-1]=temp1[(msize-i+1)*factor-1];
}
std::cout<<endl<<"in StManipulateStr:"<<temp2<<endl;
return string(temp2);
}catch(...){}
}
static string clockwise(string strInput,unsigned int factor,bool flag)
{
unsigned int len=(strInput.size());
unsigned int msize=len/factor; // 5/2=2,5/3=1,5/4=1,5/5=1
if(msize<=1) return strInput;
std::cout<<endl<<"in StManipulateStr:"<<strInput<<endl;
try
{
char* temp=new char[len+1];
memcpy(temp,strInput.c_str(),size_t(len));
temp[len]='\0';
if(flag)//顺时针
{
char sentinel=temp[msize*factor-1];
for(int i=msize;i>1;i--)
{
temp[i*factor-1]=temp[(i-1)*factor-1];
}
temp[factor-1]=sentinel;
}
else
{
char sentinel=temp[factor-1];
for(int i=1;i<msize;i++)
{
temp[i*factor-1]=temp[(i+1)*factor-1];
}
temp[msize*factor-1]=sentinel;
}
std::cout<<endl<<"in StManipulateStr:"<<temp<<endl;
return string(temp);
}catch(...){}
}
};
class AbsRequest
{
virtual void convertResult(char*)=0;
};// 职责链模式的请求对象
class Request:public AbsRequest
{
public:
Request(char* str)
{
_str=string(str);
_resultStr=string(str);
}
int getLen(){return static_cast<int>(_str.size());}
void setResult(string instr)
{
_resultStr=instr;
}
void convertResult(char* pbuf){strcpy(pbuf,_resultStr.c_str());}
string getStr(){return _str;};
string getResult(){return _resultStr;};
private:
string _str;
string _resultStr;
};
class AbsHandler
{
public:
AbsHandler()
{
_nextHandler=NULL;
cout<<endl<<"AbsHandler constructor"<<endl;
}
virtual ~AbsHandler(){}// 虚析构函数
virtual bool handle(AbsRequest& mareq){std::cout<<"name of the para is:"<<typeid(mareq).name()<<endl; return true;};
virtual AbsHandler* getNext(){return _nextHandler;};
virtual void setNext(AbsHandler* mreq){_nextHandler=mreq;};
protected:
AbsHandler* _nextHandler;
};
class ConcreteHandler:public AbsHandler
{
public:
ConcreteHandler(bool flag,unsigned int fac):_flag(flag),_factor(fac){cout<<"ConcreteHandler constructor"<<endl;}
~ConcreteHandler(){cout<<"ConcreteHandler destructor"<<endl;}
virtual bool handle(AbsRequest& mareq)
{
try
{
std::cout<<"in function handle:name of the para is:"<<typeid(mareq).name()<<endl;
Request& mreq=dynamic_cast<Request&>(mareq);
mreq.setResult(StManipulateStr::clockwise(mreq.getResult(),_factor,_flag));//本节处理
if(NULL==_nextHandler)
{
std::cout<<"next handler null"<<endl;
return false;//什么也不做
}
return _nextHandler->handle(mreq); //继续下一步的处理
}
catch(bad_cast){}
};
private:
bool _flag;
unsigned int _factor;
};
class AbsFactory
{
public:
virtual ~AbsFactory(){}
virtual AbsHandler* getProduct(bool,unsigned int fac )=0;
};
class HandlerFactory: public AbsFactory
{
public:
HandlerFactory(){cout<<endl<<"HandlerFactory constructor "<<endl;}
~HandlerFactory(){cout<<"HandlerFactory destructor "<<endl;}
AbsHandler* getProduct(bool flag,unsigned int fac)
{
return new ConcreteHandler(flag,fac);
}//getProduct
};
extern unsigned int GetDecrypt(char* intputstr, char** pOutputstr)
{
if(NULL==intputstr||NULL==pOutputstr) return -1;
try
{
auto_ptr<HandlerFactory> pmfac(new HandlerFactory);
int len=string(intputstr).length();
vector<AbsHandler*> hvec;
for(int i=1;i<=len;i++)
{
AbsHandler* han=pmfac->getProduct((1==(i%2)),i);
hvec.push_back(han);
}
vector<AbsHandler*>::iterator iter=hvec.begin();
for(int i=0;i<len-1;i++)
{
(*iter)->setNext(hvec.at(i+1));
iter++;
}
Request mreq(intputstr);// 新建一个需求
hvec.at(0)->handle(mreq);//处理需求
char* buf=(char*)malloc(mreq.getLen()+1);//开辟内存
mreq.convertResult(buf);//复制结果
*pOutputstr=buf;//输出结果
}catch(...){}
return 0;
}
#include <stdlib.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <typeinfo>
#include <vector>
#include <memory>
using namespace std;
/* 功能:取得解密串
* 输入:intputstr :加密串
* 输出:pOutputstr:解密串
* 返回:解密成功返回0,否则返回-1
*/
/*
详细描述:
输入一篇加密后的字符串,输出解密后的字符串。
规则:
1.获得一段文字后,求出它的长度(包括空格)len。
2.进入加密运算的第1步:把所有下标是1倍数的字符做顺时针旋转。
3.进入加密运算的第2步:把所有下标是2倍数的字符做逆时针旋转。
4.进入加密运算的第3步:把所有下标是3倍数的字符做顺时针旋转。
5.按上面的规则,第奇数步按顺时针旋转,偶数步按逆时针旋转,一直到第len步为止。
例子:
比如原文是:abcde
1.获得长度len = 5
2.1的倍数有1、2、3、4、5,所以把这5个字符按顺时针旋转,得到eabcd。
3.2的倍数有2、4,所以把这2个字符按逆时针旋转,得到ecbad。
4.3的倍数有3,所以把这1个字符按顺时针旋转,得到ecbad。
5.4的倍数有4,所以把这1个字符按逆时针旋转,得到ecbad。
6.5的倍数有5,所以把这1个字符按顺时针旋转,得到ecbad。
最后的结果是ecbad。
*/
struct StManipulateStr
{
static string revert(string strInput,unsigned int factor)
{
unsigned int len=(strInput.size());
unsigned int msize=len/factor; // 5/2=2,5/3=1,5/4=1,5/5=1
if(msize<=1) return strInput;
try
{
char* temp1=new char[len+1];
char* temp2=new char[len+1];
memcpy(temp1,strInput.c_str(),size_t(len));
memcpy(temp2,strInput.c_str(),size_t(len));//输出延续输入
temp1[len]='\0';
temp2[len]='\0';
for(int i=1;i<=msize;i++)
{
temp2[i*factor-1]=temp1[(msize-i+1)*factor-1];
}
std::cout<<endl<<"in StManipulateStr:"<<temp2<<endl;
return string(temp2);
}catch(...){}
}
static string clockwise(string strInput,unsigned int factor,bool flag)
{
unsigned int len=(strInput.size());
unsigned int msize=len/factor; // 5/2=2,5/3=1,5/4=1,5/5=1
if(msize<=1) return strInput;
std::cout<<endl<<"in StManipulateStr:"<<strInput<<endl;
try
{
char* temp=new char[len+1];
memcpy(temp,strInput.c_str(),size_t(len));
temp[len]='\0';
if(flag)//顺时针
{
char sentinel=temp[msize*factor-1];
for(int i=msize;i>1;i--)
{
temp[i*factor-1]=temp[(i-1)*factor-1];
}
temp[factor-1]=sentinel;
}
else
{
char sentinel=temp[factor-1];
for(int i=1;i<msize;i++)
{
temp[i*factor-1]=temp[(i+1)*factor-1];
}
temp[msize*factor-1]=sentinel;
}
std::cout<<endl<<"in StManipulateStr:"<<temp<<endl;
return string(temp);
}catch(...){}
}
};
class AbsRequest
{
virtual void convertResult(char*)=0;
};// 职责链模式的请求对象
class Request:public AbsRequest
{
public:
Request(char* str)
{
_str=string(str);
_resultStr=string(str);
}
int getLen(){return static_cast<int>(_str.size());}
void setResult(string instr)
{
_resultStr=instr;
}
void convertResult(char* pbuf){strcpy(pbuf,_resultStr.c_str());}
string getStr(){return _str;};
string getResult(){return _resultStr;};
private:
string _str;
string _resultStr;
};
class AbsHandler
{
public:
AbsHandler()
{
_nextHandler=NULL;
cout<<endl<<"AbsHandler constructor"<<endl;
}
virtual ~AbsHandler(){}// 虚析构函数
virtual bool handle(AbsRequest& mareq){std::cout<<"name of the para is:"<<typeid(mareq).name()<<endl; return true;};
virtual AbsHandler* getNext(){return _nextHandler;};
virtual void setNext(AbsHandler* mreq){_nextHandler=mreq;};
protected:
AbsHandler* _nextHandler;
};
class ConcreteHandler:public AbsHandler
{
public:
ConcreteHandler(bool flag,unsigned int fac):_flag(flag),_factor(fac){cout<<"ConcreteHandler constructor"<<endl;}
~ConcreteHandler(){cout<<"ConcreteHandler destructor"<<endl;}
virtual bool handle(AbsRequest& mareq)
{
try
{
std::cout<<"in function handle:name of the para is:"<<typeid(mareq).name()<<endl;
Request& mreq=dynamic_cast<Request&>(mareq);
mreq.setResult(StManipulateStr::clockwise(mreq.getResult(),_factor,_flag));//本节处理
if(NULL==_nextHandler)
{
std::cout<<"next handler null"<<endl;
return false;//什么也不做
}
return _nextHandler->handle(mreq); //继续下一步的处理
}
catch(bad_cast){}
};
private:
bool _flag;
unsigned int _factor;
};
class AbsFactory
{
public:
virtual ~AbsFactory(){}
virtual AbsHandler* getProduct(bool,unsigned int fac )=0;
};
class HandlerFactory: public AbsFactory
{
public:
HandlerFactory(){cout<<endl<<"HandlerFactory constructor "<<endl;}
~HandlerFactory(){cout<<"HandlerFactory destructor "<<endl;}
AbsHandler* getProduct(bool flag,unsigned int fac)
{
return new ConcreteHandler(flag,fac);
}//getProduct
};
extern unsigned int GetDecrypt(char* intputstr, char** pOutputstr)
{
if(NULL==intputstr||NULL==pOutputstr) return -1;
try
{
auto_ptr<HandlerFactory> pmfac(new HandlerFactory);
int len=string(intputstr).length();
vector<AbsHandler*> hvec;
for(int i=1;i<=len;i++)
{
AbsHandler* han=pmfac->getProduct((1==(i%2)),i);
hvec.push_back(han);
}
vector<AbsHandler*>::iterator iter=hvec.begin();
for(int i=0;i<len-1;i++)
{
(*iter)->setNext(hvec.at(i+1));
iter++;
}
Request mreq(intputstr);// 新建一个需求
hvec.at(0)->handle(mreq);//处理需求
char* buf=(char*)malloc(mreq.getLen()+1);//开辟内存
mreq.convertResult(buf);//复制结果
*pOutputstr=buf;//输出结果
}catch(...){}
return 0;
}
相关文章推荐
- 设计模式解密(2)- 工厂模式(简单工厂、工厂方法、抽象工厂)
- 模式识别与机器学习基础之1-一个简单的回归问题(regression problem)
- 求解一个简单的创建单链表的问题为什么用二级指针 ?
- .net(简单的解密小程序和小鸡问题的求解)
- 一个简单程序思考计算机里int数据的存储问题,兼论大端模式和小端模式
- .net(简单的解密小程序和小鸡问题的求解)
- 你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的
- sql server选择了混合模式问题
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- Linux下的一个简单汇编程序, .long声明数据的长度问题!
- 一个简单的MVP模式
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
- 一个简单的跨库事务问题
- 图层知识,简单讲解一下27种图层混合模式的用法
- Ext源码分析源码分析之Ext的继承模式解说——第二节、一个简单的继承
- Eclipse RCP项目依赖一个简单java project的调试问题
- 实现一个简单的订阅与发布模式的代码块,和redux
- 每天一个设计模式(4):简单工厂“模式”
- 求解组合问题的一个迭代算法
- 一个简单的Actionscript的单态模式类