先看以下C++代码:
CLanguageHandler* pLanHander = getLanguageHandler(iLanCode);
if(NULL != pLanHander)
{
pLanHander->translate(strText);
}
else
{
cout<<"Do not support this language!"<<endl;
}
CLanguageHandler* CToolManager::getLanguageHandler(int iLanCode)
{
switch iLanCode
{
case LAN_CODE_CHN:
{
return m_pChnHandler;
}
case LAN_CODE_ENG:
{
return m_pEngHandler;
}
case LAN_CODE_JPN:
{
return m_pJpnHandler;
}
default:
{
return NULL;
}
}
}
其中m_pChnHandler,m_pEngHandler等是CLanguageHandler各个子类的指针。红色部分代码,由于getLanguageHandler()方法对于不支持的语言类型返回NULL,就有了这块判空逻辑。看到if...else总是让我们眉头一皱,能不能把这块逻辑去掉,让代码更简洁,更优雅些呢?我们可以使用空对象来解决哦!空对象就是使用一个空的类,来封装空操作或者错误处理,达到简化代码逻辑的目的,以下是使用空对象后的代码:
CLanguageHandler* pLanHander = getLanguageHandler(iLanCode);
pLanHander->translate(strText);
CLanguageHandler* CToolManager::getLanguageHandler(int iLanCode)
{
switch iLanCode
{
case LAN_CODE_CHN:
{
return m_pChnHandler;
}
case LAN_CODE_ENG:
{
return m_pEngHandler;
}
case LAN_CODE_JPN:
{
return m_pJpnHandler;
}
default:
{
return m_pDefaultHandler;
}
}
}
void CDefaultHandler::translate(const std::string& strOrigText)
{
cout<<"Do not support this language!"<<endl;
return;
}
可以看到,没有了判空逻辑,程序更加清爽,默认处理也被巧妙封装到虚函数中。相比起23种设计模式来说,空对象只能算是一种小技巧,但是确实非常易学好用,可以和工厂、享元等设计模式结合起来使用,以减少代码中的坏味道。
原文链接: https://www.cnblogs.com/andrewli/archive/2013/04/07/3006104.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/83553
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!