=================================版权声明=================================
版权声明:原创文章 禁止转载
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
勿用于学术性引用。
勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善。
本文链接:http://www.cnblogs.com/wlsandwho/p/5160380.html
耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html
=======================================================================
因为要用到好多设计模式,所以我把原文拆成几部分,每部分讲解一个设计模式、用一个模式实现一个扩展功能。wlsandwho王林森
(这意味着还有一篇。)
=======================================================================
上一篇讲了用COMMAND模式设计事务小工具的基本骨架,传送门:C++基础——模拟事务 (1)COMMAND模式
这里将继续使用Composite模式,以使事务可以嵌套。wlsandwho王林森
=======================================================================
下面该去考虑如何实现“嵌套事务”了。wlsandwho王林森
想要一个事务像一个任务一样,被添加到另一个事务里,并且能任意的组合,形成一个树形的结构,那么事务肯定要有和任务一样的接口。
好像composite模式比较合适处理这个问题。
*的典型的composite对象结构图我就不画了,composite结构图我也不画了。wlsandwho王林森
事务要想拥有任务的功能,最简单的方法是事务类继承任务类。考虑到单继承、多继承之争,我采用单继承实现。
大致结构图如下。wlsandwho王林森
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAAISCAIAAADuijV3AAAgAElEQVR4nOzdd3wT5R8H8A97SNlDpEDZu0CRIZRCGS1toUzZyCzIpuwyy5C9ERdqFfgpQxEZskSGgCBLkC2lbApllzILz++PpJedJmkuuSSf94s/6GXcc7nn7r6f3N0TCCIiIiIiIjINzm4AERERERGRojE1ERERERERmcPUREREREREZA5TExERERERkTlMTUREREREROYwNREREREREZnD1ERERERERGQOUxMREREREZE5TE1ERERERETmMDURERERERGZw9RERERERERkDlMTERERERGROUxNRERERERE5jA1ERERERERmcPUREREREREZA5TExERERERkTlMTUREREREROYwNREREREREZnD1ERERERERGQOUxMREREREZE5TE1ERERERETmMDURERERERGZw9RERERERERkDlMTERERERGROUxNRERERERE5jA1ERERERERmcPUREREREREZI7Nqeny89DS971LP/7isj2bQ0q0K9G79H3v0ok77f5kko/iV8TO0fe9S9/3Hv3SDu/F3ZHHUs6qV/wWR0REaeNJqSl2+WPv0ve9Wz2Ptf5Rj8bU5Fj26YqKXxEumprsuKPQeyv1B2Lkn9nl2pXoXfr+8F3mZqT3zqHLky1tm+kVpHlC6fvmG5DK3NXrztw/cw1WzpFI8VscERGljeNSU/IXrUyVGmYesqOXw80d3c0/6tmYmhzKTl1R8SvCNVOTHXcU+m9lVWrSe7LJ9qi7gcE/8/tb7SRjZAWpW67/z/CZlsw99dRkdrXa80iUNorf4oiIKG0clZrMfEHroJM85g9pPOCZwdTkSPb6ABW/IlwyNdnxUzV4K9UHknoeMxYzjL/K2MeS6kmklJY8Dm1l9GnJX6imG7Rcvxm2zl3/yRYFPDscidJK8VscERGljaekJvWR3sSVHuYf9XhMTY5jv66o+BXhgqnJjjsKI29lVWpKeaHZc1+Xn4ca+3hToovZr5BGvzS+gtT9Sv+jVj9Z7ySSDXPXUH9EqXwgTE1EROQgHpKazLdWOVfGKxNTk8PYsSsqfkW4Xmqy41yMvZWlqUmHTVcMmlsQ1Rsm7jSxgkyuNRNpysq5G75hah2YqYmIiBzEPqlJumbDyBXzJi7W1zoqG3tICL2DkO4sDI7Z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k2PJpmHpSSGDf6Yiosl/6lmkfuldKvW9yTO3Jt7Z2Pgc1szdzOWOasa2aHsdiZiaiIgoFY5LTXrHUTNVtbHDmE5JYcFMbR8HwvBphoVOapfNOPCFZr7A1q9Wbf6C1poVYeazNdceE5+D9qdhrIbTTwJ6n5uNH45VDU5jsSVfVzTyzql8XELzTbzW8qY5NWm3X/VPlUxMFuU2LKwNTbJk/aa6dizfNCxZ0QZJw/hZF6enJiH0h6dPZW9v0dyt+JHcNJxrMmgbUxMREVnI5tTkAGk4CKVlHAhSJqsH13IF7IpKlvrasXgfxRVNRETk4twyNaVxHAhSIsvGBnQt7IpKZsnasXAfxRVNRETk8twxNaV5HAhSnDTe165M7IpKZtHasWwfxRVNRETk+twxNZEL25VocEOL5g4KtzrRRG6A+ygiIiJPwdREimJyJDF3u6OJ3AH3UURERJ6CqYkUR3d4LvYBUizuo4iIiDyFklMTERERERGR8zE1ERERERERmcPUREREREREZA5TExERERERkTlMTUREREREROYwNREREREREZnD1ERERERERGQOUxMREREREZE5TE1ERERERETmMDURERERERGZw9RERERERERkDlMTERERERGROUxNRERERERE5jA1ERERERERmcPUREREREREZA5TExERERERkTlMTUREREREROYwNREREREREZnD1ERERERERGQOUxMREREREZE5TE1ERERERETmMDURERERERGZw9RERERERERkDlMTERERERGROUxNRERERERE5jA1ERERERERmcPUREREREREZA5TExERERERkTlMTUREREREROYwNREREREREZnD1ERERERERGQOUxMREREREZE5TE1ERERERETmMDURERERERGZw9RERERERERkDlMTERERERGROUxNRERERERE5jA1Ebm8qKioYsWKlSd3V6pUqSZNmji7uxE5yLVr1/Lnz+/szY4cIX/+/NeuXXN2jyNKBVMTkcvr0qULyDO89957zu5uRA4SGxvr7A2OHCc2NtbZPY4oFUxNRC6ve/fuzj7ekYMUL17c2d2NyEHi4uKcvcGR48TFxTm7xxGlgqmJyOVJqWn69OmXL18+Te7lwoUL27ZtU61ipibyHFJqKlKkSHx8vLM3RLK/+Pj4IkWKMDWRq2BqInJ5UmpauXKls9tC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" alt="" />
如此一来,CTransactionBase有了CTaskBase的接口,就能够把一个CTransaction加到另一个CTransaction的容器里。wlsandwho王林森
回顾一下CTaskBase的两个接口函数,一个是Do,Do里执行Doing,另一个Undo,Undo里执行Undoing。Doing和Undoing是用Set函数进行手工设置绑定的。
CTransactionBase继承此接口后,Do里执行Commit,Undo里执行Rollback。Commit和Rollback是CTransactionBase的保护成员函数。这样,
把一个CTransaction加到另一个CTransaction的容器里时,不再需要额外的设置Do和Undo的动作,他们是内置的。
下面上第三版代码。wlsandwho王林森
=======================================================================
#include <iostream>
#include <list>
#include <string>
#include <functional> namespace TransactionbyWLS
{
class CTaskItemBase
{
public:
virtual bool Doing()=;
virtual bool Undoing()=;
}; static const int ENUM_BALENCEPOINT=;
static const int ENUM_BOUNDARYRANGE=;
static const int ENUM_UPPERBOUNDARY=ENUM_BALENCEPOINT+ENUM_BOUNDARYRANGE;
static const int ENUM_LOWERBOUNDARY=ENUM_BALENCEPOINT-ENUM_BOUNDARYRANGE;
static const int ENUM_DELTA=;
static const int ENUM_TRUE=;
static const int ENUM_FALSE=;
enum ETransRes {
EFALSE=ENUM_FALSE,
ETRUE=ENUM_TRUE, ECOMMITSUCCESS=ENUM_BALENCEPOINT+ENUM_DELTA,
EDUMMY=ENUM_BALENCEPOINT,//1000,dummy.
ECOMMITFAILED_ROLLBACKSUCCESS=ENUM_BALENCEPOINT-ENUM_DELTA,
ECOMMITFAILED_ROLLBACKFAILED=ENUM_BALENCEPOINT-ENUM_DELTA*,
}; class CTaskBase
{
public:
typedef std::function<bool ()> TaskCALLBACK;
TaskCALLBACK m_TaskCallbackToDo;
TaskCALLBACK m_TaskCallbackToUndo; CTaskBase():m_TaskCallbackToDo(),m_TaskCallbackToUndo(){} virtual void SetToDo(TaskCALLBACK tcbDo)
{
m_TaskCallbackToDo=tcbDo;
} virtual void SetToUndo(TaskCALLBACK tcbToUndo)
{
m_TaskCallbackToUndo=tcbToUndo;
} virtual bool Do()
{
if (m_TaskCallbackToDo)
{
return m_TaskCallbackToDo();
} DummyDo(); return true;
} virtual bool Undo()
{
if (m_TaskCallbackToUndo)
{
return m_TaskCallbackToUndo();
} DummyUnDo(); return true;
} protected:
bool DummyDo()
{
std::cerr<<"DummyDo"<<std::endl; return true;
} bool DummyUnDo()
{
std::cerr<<"DummyDo"<<std::endl; return true;
}
}; typedef CTaskBase CTransactionTask;
typedef CTaskBase* CTransactionTaskPtr; class CTransactionBase:public CTaskBase
{
public:
virtual bool AddTask(CTransactionTask*){std::cerr << "CTransactionBase:AddTask did noting."<<std::endl;return false;}
virtual ETransRes CommitOrAutoRollback(){std::cerr << "CTransactionBase:CommitOrAutoRollback did noting."<<std::endl;return EDUMMY;}
virtual bool Commit(){std::cerr<<"CTransactionBase:Commit did noting."<<std::endl; return true;}
virtual bool Rollback(){std::cerr<<"CTransactionBase:Rollback did noting."<<std::endl; return true;}
};
} namespace TransactionbyWLS
{
class CTaskItemSample:public CTaskItemBase
{
public:
virtual bool Doing()
{
std::cout<<"Doing:"<<m_strText<<std::endl; return true;
}
virtual bool Undoing()
{
std::cout<<"Undoing:"<<m_strText<<std::endl; return true;
} void SetText(std::string strText)
{
m_strText=strText;
} protected:
std::string m_strText;
}; class CTaskItemSampleWithException:public CTaskItemBase
{
public:
virtual bool Doing()
{
std::cout<<"Doing:"<<m_strText<<std::endl; throw std::string("hahaha"); return true;
}
virtual bool Undoing()
{
std::cout<<"Undoing:"<<m_strText<<std::endl; return true;
} void SetText(std::string strText)
{
m_strText=strText;
} protected:
std::string m_strText;
}; class CTask:public CTaskBase
{ }; class CTransaction:public CTransactionBase
{
protected:
typedef std::list<CTransactionTask*>::iterator ITListCmdPtr;
typedef std::list<CTransactionTask*>::reverse_iterator RITListCmdPtr; typedef std::list<CTransactionTask*> ListCmdPtr; public:
bool AddTask(CTransactionTask* poCmdPtr)
{
bool bAdding=true; try
{
m_listCmdPtr.push_back(poCmdPtr);
}
catch (std::exception& e)
{
bAdding=false;
std::cerr << "exception caught: " << e.what() <<std::endl;
}
catch (...)
{
bAdding=false;
std::cerr << "Some error occurred."<<std::endl;
} return bAdding;
} void ClearAll()//no recursion
{
m_listCmdPtr.clear();
} bool Commit()
{
bool bDone=true; for(m_itListCmdPtr=m_listCmdPtr.begin();m_itListCmdPtr!=m_listCmdPtr.end();++m_itListCmdPtr)
{
//Maybe we need a try...catch but not throwing anything anymore.
//So we need handle exceptions in the Member Function Do.
//if (!(bDone=(*it)->Do()))
//{
// break;
//} try
{
bDone=(*m_itListCmdPtr)->Do();
}
catch (...)
{
bDone=false;
std::cerr << "Some error occurred in the Commit."<<std::endl;
} if (!bDone)
{
return false;
}
} return true;
} bool Rollback()
{
if (m_itListCmdPtr==m_listCmdPtr.end())
{
RITListCmdPtr rit=m_listCmdPtr.rbegin();
return Traverse(rit,m_listCmdPtr);
}
else
{
RITListCmdPtr rit(++m_itListCmdPtr);
return Traverse(rit,m_listCmdPtr);
} return false;
} bool Do()
{
return Commit();
} bool Undo()
{
return Rollback();
} ETransRes CommitOrAutoRollback()
{
bool bDone=true;
bool bRollbackDone=false; ITListCmdPtr it;
for(it=m_listCmdPtr.begin();it!=m_listCmdPtr.end();++it)
{
//Maybe we need a try...catch but not throwing anything anymore.
//So we need handle exceptions in the Member Function Do.
//if (!(bDone=(*it)->Do()))
//{
// break;
//} try
{
bDone=(*it)->Do();
}
catch (...)
{
bDone=false;
std::cerr << "Some error occurred in the Commit part of CommitOrAutoRollback."<<std::endl;
} if (!bDone)
{
break;
}
} if (!bDone)
{
RITListCmdPtr rit(++it); for (;rit!=m_listCmdPtr.rend();++rit)
{
//The same as above.
//if (!(bRollbackDone=(*it)->UnDo()))
//{
// std::cout<<"Some error occurred."<<std::endl;
//
// return COMMITFAILED_ROLLBACKFAILED;
//} try
{
bRollbackDone=(*rit)->Undo();
}
catch (...)
{
bRollbackDone=false;
std::cerr << "Some error occurred in the AutoRollback part of CommitOrAutoRollback."<<std::endl;
} if (!bRollbackDone)
{
return ECOMMITFAILED_ROLLBACKFAILED;
}
} return ECOMMITFAILED_ROLLBACKSUCCESS;
} return ECOMMITSUCCESS;
} protected:
bool Traverse(RITListCmdPtr& rit,ListCmdPtr& list)
{
bool bRollbackDone=false; for (;rit!=m_listCmdPtr.rend();++rit)
{
//The same as above.
//if (!(bRollbackDone=(*it)->UnDo()))
//{
// std::cout<<"Some error occurred."<<std::endl;
//
// return COMMITFAILED_ROLLBACKFAILED;
//} try
{
bRollbackDone=(*rit)->Undo();
}
catch (...)
{
bRollbackDone=false;
std::cerr << "Some error occurred in the Rollback."<<std::endl;
} if (!bRollbackDone)
{
return false;
}
} return true;
} protected:
ListCmdPtr m_listCmdPtr;
ITListCmdPtr m_itListCmdPtr;
};
} int main()
{
//////////////////////////////////////////////////////////////////////////
TransactionbyWLS::CTaskItemSample oTaskItem1;
oTaskItem1.SetText("本博客作者:王林森(wlsandwho)");
TransactionbyWLS::CTask oTask1;
oTask1.SetToDo(std::bind(&TransactionbyWLS::CTaskItemSample::Doing,&oTaskItem1));
oTask1.m_TaskCallbackToUndo=std::bind(&TransactionbyWLS::CTaskItemSample::Undoing,&oTaskItem1); TransactionbyWLS::CTaskItemSample oTaskItem2;
oTaskItem2.SetText("作者的邮箱:wlsandwho@foxmail.com");
TransactionbyWLS::CTask oTask2;
oTask2.SetToDo(std::bind(&TransactionbyWLS::CTaskItemSample::Doing,&oTaskItem2));
oTask2.m_TaskCallbackToUndo=std::bind(&TransactionbyWLS::CTaskItemSample::Undoing,&oTaskItem2); // TransactionbyWLS::CTaskItemSampleWithException oTaskItem3;
// oTaskItem3.SetText("本博客禁止转载");
// TransactionbyWLS::CTask oTask3;
// oTask3.SetToDo(std::bind(&TransactionbyWLS::CTaskItemSampleWithException::Doing,&oTaskItem3));
// oTask3.m_TaskCallbackToUndo=std::bind(&TransactionbyWLS::CTaskItemSampleWithException::Undoing,&oTaskItem3);
TransactionbyWLS::CTaskItemSample oTaskItem3;
oTaskItem3.SetText("本博客禁止转载");
TransactionbyWLS::CTask oTask3;
oTask3.SetToDo(std::bind(&TransactionbyWLS::CTaskItemSample::Doing,&oTaskItem3));
oTask3.m_TaskCallbackToUndo=std::bind(&TransactionbyWLS::CTaskItemSample::Undoing,&oTaskItem3); TransactionbyWLS::CTransaction oTransaction1;
oTransaction1.AddTask(&oTask1);
oTransaction1.AddTask(&oTask2);
oTransaction1.AddTask(&oTask3);
//oTransaction1.CommitOrAutoRollback(); //////////////////////////////////////////////////////////////////////////
TransactionbyWLS::CTaskItemSample oTaskItem4;
oTaskItem4.SetText("保留一切权利");
TransactionbyWLS::CTask oTask4;
oTask4.SetToDo(std::bind(&TransactionbyWLS::CTaskItemSample::Doing,&oTaskItem4));
oTask4.m_TaskCallbackToUndo=std::bind(&TransactionbyWLS::CTaskItemSample::Undoing,&oTaskItem4); TransactionbyWLS::CTaskItemSampleWithException oTaskItem5;
oTaskItem5.SetText("文章内容不定期修订 务必阅读原文http://www.cnblogs.com/wlsandwho/p/5160380.html");
TransactionbyWLS::CTask oTask5;
oTask5.SetToDo(std::bind(&TransactionbyWLS::CTaskItemSampleWithException::Doing,&oTaskItem5));
oTask5.m_TaskCallbackToUndo=std::bind(&TransactionbyWLS::CTaskItemSampleWithException::Undoing,&oTaskItem5); // TransactionbyWLS::CTaskItemSample oTaskItem5;
// oTaskItem5.SetText("文章内容不定期修订 务必阅读原文http://www.cnblogs.com/wlsandwho/p/5160380.html");
// TransactionbyWLS::CTask oTask5;
// oTask5.SetToDo(std::bind(&TransactionbyWLS::CTaskItemSample::Doing,&oTaskItem5));
// oTask5.m_TaskCallbackToUndo=std::bind(&TransactionbyWLS::CTaskItemSample::Undoing,&oTaskItem5); TransactionbyWLS::CTransaction oTransaction2;
oTransaction2.AddTask(&oTask4);
oTransaction2.AddTask(&oTask5);
//oTransaction2.CommitOrAutoRollback(); //////////////////////////////////////////////////////////////////////////
TransactionbyWLS::CTransaction oTransaction3;
oTransaction3.AddTask(&oTransaction1);
oTransaction3.AddTask(&oTransaction2);
oTransaction3.CommitOrAutoRollback(); system("pause"); return ;
}
=======================================================================
还有很多坑,有空再填吧。键盘和桌子都好凉。(枚举值只是为了再做扩展。)
=======================================================================
因为总是有爬虫网站抓取我的博客,无视我的版权,我很伤心,所以文章最后只能这样结尾。
下面开始点名:
Asp.net教程_mvc4_C#_Ado.net_seo_Java_HTML CSS教程
www.tzwhx.com
www.th7.cn
解决方案网
帮客之家 | IT技术 建站编程 电脑教程 www.bkjia.com
软件开发,程序错误,exception
www.java123.net
一键重装系统_打造智能化重装系统软件
www.bitscn.com
http://www.admin85.com/
http://www.3fwork.com/
技术博客-最新最全的技术疑难解决博客
好库文摘 - 技术改变世界
红黑联盟:十三年IT技术门户 精英梦想由此起航 (网络安全,黑客防御,信息安全,编程,系统,网络)
以上都是侵犯我版权的爬虫网站。
=======================================================================
没什么意外的话,这会是个系列:wlsandwho王林森
C++基础——模拟事务 (1)COMMAND模式
C++基础——模拟事务 (2)COMPOSITE模式
C++基础——模拟事务 (3)CHAIN OF RESPONSIBILITY模式
=======================================================================
20160127
好消息,事务保存点功能实现啦!
上方第三个链接就是呢!
=======================================================================
(友情支持请扫描这个)
微信扫描上方二维码捐赠