设计模式之适配器模式(Adapter Pattern)

1、定义

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

2、介绍

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

3、源码

3.1、头文件

#pragma once
#include <iostream>
using namespace std;
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"
class CUserInfo :
	public IUserInfo
{
public:
	CUserInfo(void);
	~CUserInfo(void);
	string GetUserName();
	string GetHomeAddress();
	string GetMobileNumber();
	string GetOfficeTelNumber();
	string GetJobPosition();
	string GetHomeTelNumber();
};

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();
};

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 << "这个人outer的手机号码是... " << endl;
        return "0";
    }
};

OuterUserHomeInfo.h

#pragma once
#include <iostream>
using namespace std;
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 namespace std;
class COuterUserOfficeInfo
{
public:
	COuterUserOfficeInfo(void)
	{
	}
	~COuterUserOfficeInfo(void)
	{
	}
	string GetOfficeTelNumber()
	{
		cout << "办公室电话是..." << endl;
		return "0";
	}
	string GetJobPosition()
	{
		cout << "这个人的职位是BOSS..." << endl;
		return "0";
	}
};

OuterUserInfo.h

#pragma once
#include "iuserinfo.h"
#include "OuterUser.h"
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;
};

3.2、具体实现

UserInfo.cpp

#include "UserInfo.h"
CUserInfo::CUserInfo(void)
{
}
CUserInfo::~CUserInfo(void)
{
}
string CUserInfo::GetUserName()
{
	cout << "姓名叫做..." << endl;
	return "0";
}
string CUserInfo::GetHomeAddress()
{
	cout << "这里是员工的家庭地址..." << endl;
	return "0";
}
string CUserInfo::GetMobileNumber()
{
	cout << "这个人的手机号码是..." << 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";
}

 OuterUser.cpp

#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();
}

OuterUserInfo.cpp

#include "OuterUserInfo.h"
#include "OuterUserBaseInfo.h"
#include "OuterUserHomeInfo.h"
#include "OuterUserOfficeInfo.h"
COuterUserInfo::COuterUserInfo(void)
{
	m_pOuterUser = new COuterUser();
}


COuterUserInfo::~COuterUserInfo(void)
{
	delete m_pOuterUser;
}

string COuterUserInfo::GetUserName()
{
	COuterUserBaseInfo *pBaseInfo = m_pOuterUser->GetUserBaseInfo();
	string name = pBaseInfo->GetUserName();
	delete pBaseInfo;
	pBaseInfo = NULL;
	return name;
}

string COuterUserInfo::GetHomeAddress()
{
	COuterUserHomeInfo *pHomeInfo = m_pOuterUser->GetUserHomeInfo();
	pHomeInfo->GetHomeAddress();
	delete pHomeInfo;
	pHomeInfo = NULL;
	return "0";
}

string COuterUserInfo::GetMobileNumber()
{
	COuterUserBaseInfo *pBaseInfo = m_pOuterUser->GetUserBaseInfo();
	string number = pBaseInfo->GetMobileNumber();
	delete pBaseInfo;
	pBaseInfo = NULL;
	return number;
}

string COuterUserInfo::GetOfficeTelNumber()
{
	COuterUserOfficeInfo *pOfficeInfo = m_pOuterUser->GetUserOfficeInfo();
	string num = pOfficeInfo->GetOfficeTelNumber();
	delete pOfficeInfo;
	pOfficeInfo = NULL;
	return num;
}

string COuterUserInfo::GetJobPosition()
{
	COuterUserOfficeInfo *pOfficeInfo = m_pOuterUser->GetUserOfficeInfo();
	string ret = pOfficeInfo->GetJobPosition();
	delete pOfficeInfo;
	pOfficeInfo = NULL;
	return ret;
}

string COuterUserInfo::GetHomeTelNumber()
{
	COuterUserHomeInfo *pHomeInfo = m_pOuterUser->GetUserHomeInfo();
	string ret = pHomeInfo->GetHomeTelNumber();
	delete pHomeInfo;
	pHomeInfo = NULL;
	return ret;
}

Adapter.cpp

#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();

    system(“pause”)

    return 0;
}

4、结果

参考文献:《菜鸟教程》? ?https://blog.csdn.net/phiall/article/details/52199659博客

猜你喜欢

转载自blog.csdn.net/w_x_myself/article/details/82146572