設計模式C++之八(Adapter適配器模式)

 

適配器模式,使用之處比較特殊,不屬於常規設計模式,主要用於不同系統之間的處理。是將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。也是一個比較簡單的模式,直接上代碼了。

看代碼:

8.1.解釋

main(),主程序

IUserInfo,本系統內接口

CUserInfo,本系統內實現類

IOuterUser,外系統接口

COuterUser,外系統實現類

COuterUserInfo,本系統內適配類

說明:COuterUserInfo實現IUserInfo接口,將外部系統實現類COuterUser轉換成本系統內的接口IUserInfo。使用外部數據跟使用本系統內部數據一樣。

注意:COuterUserInfo繼承了IUserInfo,如果同時繼承了COuterUser則是類適配器。如果COuterUserInfo只是使用了COuterUser則是對象適配器。

//IUserInfo.h//系統內部的實體接口

#pragma once
#include <iostream>
using std::string;
class IUserInfo
{
public:
    IUserInfo(void)
    {
    }
    virtual ~IUserInfo(void)
    {
    }
    virtual string GetUserName() = 0;
    virtual string GetHomeAddress() = 0;
    virtual string GetMobileNumber() = 0;
    virtual string GetOfficeTelNumber() = 0;
    virtual string GetJobPosition() = 0;
    virtual string GetHomeTelNumber() = 0;
};

//UserInfo.h//系統內部實體類

#pragma once
#include "iuserinfo.h"
#include <iostream>
using std::string;
class CUserInfo :
    public IUserInfo
{
public:
    CUserInfo(void);
    ~CUserInfo(void);
    string GetUserName();
    string GetHomeAddress();
    string GetMobileNumber();
    string GetOfficeTelNumber();
    string GetJobPosition();
    string GetHomeTelNumber();
};

//UserInfo.cpp

#include "StdAfx.h"
#include "UserInfo.h"
#include <iostream>
using std::cout;
using std::endl;
using std::string;
CUserInfo::CUserInfo(void)
{
}
CUserInfo::~CUserInfo(void)
{
}
string CUserInfo::GetUserName()
{
    cout << "姓名叫做..." << endl;
    return "0";
}
string CUserInfo::GetHomeAddress()
{
    cout << "這裏是員工的家庭地址..." << endl;
    return "0";
}
string CUserInfo::GetMobileNumber()
{
    cout << "這個人的手機號碼是0000..." << endl;
    return "0";
}
string CUserInfo::GetOfficeTelNumber()
{
    cout << "辦公室電話是..." << endl;
    return "0";
}
string CUserInfo::GetJobPosition()
{
    cout << "這個人的職位是BOSS..." << endl;
    return "0";
}
string CUserInfo::GetHomeTelNumber()
{
    cout << "員工的家庭電話是..." << endl;
    return "0";
}

//IOuterUser.h//外部系統實體接口

#pragma once
#include "OuterUserBaseInfo.h"
#include "OuterUserHomeInfo.h"
#include "OuterUserOfficeInfo.h"
class IOuterUser
{
public:
    IOuterUser(void)
    {
    }
    ~IOuterUser(void)
    {
    }
    COuterUserBaseInfo * GetUserBaseInfo();
    COuterUserHomeInfo * GetUserHomeInfo();
    COuterUserOfficeInfo * GetUserOfficeInfo();
};

//OuterUser.h//外部系統實體類

#pragma once
#include "OuterUserBaseInfo.h"
#include "OuterUserHomeInfo.h"
#include "OuterUserOfficeInfo.h"
class IOuterUser
{
public:
    IOuterUser(void)
    {
    }
    ~IOuterUser(void)
    {
    }
    COuterUserBaseInfo * GetUserBaseInfo();
    COuterUserHomeInfo * GetUserHomeInfo();
    COuterUserOfficeInfo * GetUserOfficeInfo();
};

//OuterUser.cpp

#include "StdAfx.h"
#include "OuterUser.h"
#include "OuterUserBaseInfo.h"
#include "OuterUserHomeInfo.h"
#include "OuterUserOfficeInfo.h"
COuterUser::COuterUser(void)
{
}
COuterUser::~COuterUser(void)
{
}
COuterUserBaseInfo * COuterUser::GetUserBaseInfo()
{
    return new COuterUserBaseInfo();
}
COuterUserHomeInfo * COuterUser::GetUserHomeInfo()
{
    return new COuterUserHomeInfo();
}
COuterUserOfficeInfo * COuterUser::GetUserOfficeInfo()
{
    return new COuterUserOfficeInfo();
}

//OuterUserBaseInfo.h

#pragma once
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class COuterUserBaseInfo
{
public:
    COuterUserBaseInfo(void)
    {
    }
    ~COuterUserBaseInfo(void)
    {
    }
    string GetUserName()
    {
        cout << "姓名叫做..." << endl;
        return "0";
    }
    string GetMobileNumber()
    {
        cout << "這個人的手機號碼是0001..." << endl;
        return "0";
    }
};

//OuterUserHomeInfo.h

#pragma once
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class COuterUserHomeInfo
{
public:
    COuterUserHomeInfo(void)
    {
    }
    ~COuterUserHomeInfo(void)
    {
    }
    string GetHomeAddress()
    {
        cout << "這裏是員工的家庭地址..." << endl;
        return "0";
    }
    string GetHomeTelNumber()
    {
        cout << "員工的家庭電話是..." << endl;
        return "0";
    }
};

//OuterUserOfficeInfo.h

#pragma once
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class COuterUserOfficeInfo
{
public:
    COuterUserOfficeInfo(void)
    {
    }
    ~COuterUserOfficeInfo(void)
    {
    }
    string GetOfficeTelNumber()
    {
        cout << "辦公室電話是..." << endl;
        return "0";
    }
    string GetJobPosition()
    {
        cout << "這個人的職位是BOSS..." << endl;
        return "0";
    }
};

//OuterUserInfo.h//由IUserInfo接口派生的實體類,並引入外部系統實體的實例

#pragma once
#include "iuserinfo.h"
#include "OuterUser.h"
#include <iostream>
using std::string;
class COuterUserInfo :
    public IUserInfo
{
public:
    COuterUserInfo(void);
    ~COuterUserInfo(void);
    string GetUserName();
    string GetHomeAddress();
    string GetMobileNumber();
    string GetOfficeTelNumber();
    string GetJobPosition();
    string GetHomeTelNumber();
private:
    COuterUser *m_pOuterUser;
};
//OuterUserInfo.cpp

#include "StdAfx.h"
#include "OuterUserInfo.h"
#include "OuterUserBaseInfo.h"
#include "OuterUserHomeInfo.h"
#include "OuterUserOfficeInfo.h"
#include <iostream>
using std::cout;
using std::endl;
using std::string;
COuterUserInfo::COuterUserInfo(void)
{
    m_pOuterUser = new COuterUser();
}
COuterUserInfo::~COuterUserInfo(void)
{
    delete m_pOuterUser;
}
string COuterUserInfo::GetUserName()
{
    COuterUserBaseInfo *pBaseInfo = m_pOuterUser->GetUserBaseInfo();
    pBaseInfo->GetUserName();
    delete pBaseInfo;
    pBaseInfo = NULL;
    return "0";
}
string COuterUserInfo::GetHomeAddress()
{
    COuterUserHomeInfo *pHomeInfo = m_pOuterUser->GetUserHomeInfo();
    pHomeInfo->GetHomeAddress();
    delete pHomeInfo;
    pHomeInfo = NULL;
    return "0";
}
string COuterUserInfo::GetMobileNumber()
{
    COuterUserBaseInfo *pBaseInfo = m_pOuterUser->GetUserBaseInfo();
    pBaseInfo->GetMobileNumber();
    delete pBaseInfo;
    pBaseInfo = NULL;
    return "0";
}
string COuterUserInfo::GetOfficeTelNumber()
{
    COuterUserOfficeInfo *pOfficeInfo = m_pOuterUser->GetUserOfficeInfo();
    pOfficeInfo->GetOfficeTelNumber();
    delete pOfficeInfo;
    pOfficeInfo = NULL;
    return "0";
}
string COuterUserInfo::GetJobPosition()
{
    COuterUserOfficeInfo *pOfficeInfo = m_pOuterUser->GetUserOfficeInfo();
    pOfficeInfo->GetJobPosition();
    delete pOfficeInfo;
    pOfficeInfo = NULL;
    return "0";
}
string COuterUserInfo::GetHomeTelNumber()
{
    COuterUserHomeInfo *pHomeInfo = m_pOuterUser->GetUserHomeInfo();
    pHomeInfo->GetHomeTelNumber();
    delete pHomeInfo;
    pHomeInfo = NULL;
    return "0";
}
//Adapter.cpp//使用方法

#include "stdafx.h"
#include "IOuterUser.h"
#include "IUserInfo.h"
#include "UserInfo.h"
#include "OuterUserInfo.h"
void DoIt()
{
    IUserInfo *pYourGirl = new CUserInfo();
    for(int i = 0; i < 101; i += 20)
    {
        pYourGirl->GetMobileNumber();
    }
    delete pYourGirl;
}
void NowDoIt()
{
    IUserInfo *pYourGirl = new COuterUserInfo();

    for(int i = 0; i < 101; i += 20)
    {
        pYourGirl->GetMobileNumber();
    }

    delete pYourGirl;
}
int _tmain(int argc, _TCHAR* argv[])
{
    DoIt();

    NowDoIt();

    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
    _CrtDumpMemoryLeaks();
    return 0;
}

適配器模式屬於結構型模式,當出現數據接口不一致的情況下,纔會使用到。例如,之前做過的一個系統,所有的組織結構都是由另一個系統來維護,但我們開發的系統需要用到這些組織結構,並且在我們的系統裏組織結構是隻讀的。因爲系統設計的原因,所以兩個系統的結構設計並不一樣,正好應用到了適配器模式。

發佈了8 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章