C++小技巧——空对象

 先看以下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种设计模式来说,空对象只能算是一种小技巧,但是确实非常易学好用,可以和工厂、享元等设计模式结合起来使用,以减少代码中的坏味道。

posted @ 2013-04-07 20:48  学学自由泳  阅读(2918)  评论(0编辑  收藏  举报