结构型模式のAdapter适配器模式
适配器模式,使用之处比较特殊,不属于常规设计模式,主要用于不同系统之间的处理。是将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。也是一个比较简单的模式,直接上代码了。
看代码:
8.1.解释
main(),主程序
IUserInfo,本系统内接口
CUserInfo,本系统内实现类
IOuterUser,外系统接口
COuterUser,外系统实现类
COuterUserInfo,本系统内适配类
说明:COuterUserInfo实现IUserInfo接口,将外部系统实现类COuterUser转换成本系统内的接口IUserInfo。使用外部数据跟使用本系统内部数据一样。
注意:COuterUserInfo继承了IUserInfo,如果同时继承了COuterUser则是类适配器。如果COuterUserInfo只是使用了COuterUser则是对象适配器。
1 //IUserInfo.h//系统内部的实体接口 2 3 #pragma once 4 #include <iostream> 5 using std::string; 6 class IUserInfo 7 { 8 public: 9 IUserInfo(void) 10 { 11 } 12 virtual ~IUserInfo(void) 13 { 14 } 15 virtual string GetUserName() = 0; 16 virtual string GetHomeAddress() = 0; 17 virtual string GetMobileNumber() = 0; 18 virtual string GetOfficeTelNumber() = 0; 19 virtual string GetJobPosition() = 0; 20 virtual string GetHomeTelNumber() = 0; 21 };
1 //UserInfo.h//系统内部实体类 2 3 #pragma once 4 #include "iuserinfo.h" 5 #include <iostream> 6 using std::string; 7 class CUserInfo : 8 public IUserInfo 9 { 10 public: 11 CUserInfo(void); 12 ~CUserInfo(void); 13 string GetUserName(); 14 string GetHomeAddress(); 15 string GetMobileNumber(); 16 string GetOfficeTelNumber(); 17 string GetJobPosition(); 18 string GetHomeTelNumber(); 19 }; 20 21 //UserInfo.cpp 22 23 #include "StdAfx.h" 24 #include "UserInfo.h" 25 #include <iostream> 26 using std::cout; 27 using std::endl; 28 using std::string; 29 CUserInfo::CUserInfo(void) 30 { 31 } 32 CUserInfo::~CUserInfo(void) 33 { 34 } 35 string CUserInfo::GetUserName() 36 { 37 cout << "姓名叫做..." << endl; 38 return "0"; 39 } 40 string CUserInfo::GetHomeAddress() 41 { 42 cout << "这里是员工的家庭地址..." << endl; 43 return "0"; 44 } 45 string CUserInfo::GetMobileNumber() 46 { 47 cout << "这个人的手机号码是0000..." << endl; 48 return "0"; 49 } 50 string CUserInfo::GetOfficeTelNumber() 51 { 52 cout << "办公室电话是..." << endl; 53 return "0"; 54 } 55 string CUserInfo::GetJobPosition() 56 { 57 cout << "这个人的职位是BOSS..." << endl; 58 return "0"; 59 } 60 string CUserInfo::GetHomeTelNumber() 61 { 62 cout << "员工的家庭电话是..." << endl; 63 return "0"; 64 }
1 //IOuterUser.h//外部系统实体接口 2 3 #pragma once 4 #include "OuterUserBaseInfo.h" 5 #include "OuterUserHomeInfo.h" 6 #include "OuterUserOfficeInfo.h" 7 class IOuterUser 8 { 9 public: 10 IOuterUser(void) 11 { 12 } 13 ~IOuterUser(void) 14 { 15 } 16 COuterUserBaseInfo * GetUserBaseInfo(); 17 COuterUserHomeInfo * GetUserHomeInfo(); 18 COuterUserOfficeInfo * GetUserOfficeInfo(); 19 };
1 //OuterUser.h 2 #pragma once 3 #include "iouteruser.h" 4 5 class COuterUser : 6 public IOuterUser 7 { 8 public: 9 COuterUser(void); 10 virtual ~COuterUser(void); 11 COuterUserBaseInfo * GetUserBaseInfo(); 12 COuterUserHomeInfo * GetUserHomeInfo(); 13 COuterUserOfficeInfo * GetUserOfficeInfo(); 14 15 }; 16 17 //OuterUser.cpp 18 19 #include "StdAfx.h" 20 #include "OuterUser.h" 21 22 COuterUser::COuterUser(void) 23 { 24 } 25 26 27 COuterUser::~COuterUser(void) 28 { 29 } 30 31 COuterUserBaseInfo * COuterUser::GetUserBaseInfo(){ 32 return new COuterUserBaseInfo(); 33 } 34 35 COuterUserHomeInfo * COuterUser::GetUserHomeInfo(){ 36 return new COuterUserHomeInfo(); 37 } 38 39 COuterUserOfficeInfo * COuterUser::GetUserOfficeInfo(){ 40 return new COuterUserOfficeInfo(); 41 }
1 //OuterUserBaseInfo.h 2 3 #pragma once 4 #include <iostream> 5 using std::cout; 6 using std::endl; 7 using std::string; 8 class COuterUserBaseInfo 9 { 10 public: 11 COuterUserBaseInfo(void) 12 { 13 } 14 ~COuterUserBaseInfo(void) 15 { 16 } 17 string GetUserName() 18 { 19 cout << "姓名叫做..." << endl; 20 return "0"; 21 } 22 string GetMobileNumber() 23 { 24 cout << "这个人的手机号码是0001..." << endl; 25 return "0"; 26 } 27 };
1 //OuterUserHomeInfo.h 2 3 #pragma once 4 #include <iostream> 5 using std::cout; 6 using std::endl; 7 using std::string; 8 class COuterUserHomeInfo 9 { 10 public: 11 COuterUserHomeInfo(void) 12 { 13 } 14 ~COuterUserHomeInfo(void) 15 { 16 } 17 string GetHomeAddress() 18 { 19 cout << "这里是员工的家庭地址..." << endl; 20 return "0"; 21 } 22 string GetHomeTelNumber() 23 { 24 cout << "员工的家庭电话是..." << endl; 25 return "0"; 26 } 27 };
1 //OuterUserOfficeInfo.h 2 3 #pragma once 4 #include <iostream> 5 using std::cout; 6 using std::endl; 7 using std::string; 8 class COuterUserOfficeInfo 9 { 10 public: 11 COuterUserOfficeInfo(void) 12 { 13 } 14 ~COuterUserOfficeInfo(void) 15 { 16 } 17 string GetOfficeTelNumber() 18 { 19 cout << "办公室电话是..." << endl; 20 return "0"; 21 } 22 string GetJobPosition() 23 { 24 cout << "这个人的职位是BOSS..." << endl; 25 return "0"; 26 } 27 };
1 //OuterUserInfo.h//由IUserInfo接口派生的实体类,并引入外部系统实体的实例 2 3 #pragma once 4 #include "iuserinfo.h" 5 #include "OuterUser.h" 6 #include <iostream> 7 using std::string; 8 class COuterUserInfo : 9 public IUserInfo 10 { 11 public: 12 COuterUserInfo(void); 13 ~COuterUserInfo(void); 14 string GetUserName(); 15 string GetHomeAddress(); 16 string GetMobileNumber(); 17 string GetOfficeTelNumber(); 18 string GetJobPosition(); 19 string GetHomeTelNumber(); 20 private: 21 COuterUser *m_pOuterUser; 22 }; 23 //OuterUserInfo.cpp 24 25 #include "StdAfx.h" 26 #include "OuterUserInfo.h" 27 #include "OuterUserBaseInfo.h" 28 #include "OuterUserHomeInfo.h" 29 #include "OuterUserOfficeInfo.h" 30 #include <iostream> 31 using std::cout; 32 using std::endl; 33 using std::string; 34 COuterUserInfo::COuterUserInfo(void) 35 { 36 m_pOuterUser = new COuterUser(); 37 } 38 COuterUserInfo::~COuterUserInfo(void) 39 { 40 delete m_pOuterUser; 41 } 42 string COuterUserInfo::GetUserName() 43 { 44 COuterUserBaseInfo *pBaseInfo = m_pOuterUser->GetUserBaseInfo(); 45 pBaseInfo->GetUserName(); 46 delete pBaseInfo; 47 pBaseInfo = NULL; 48 return "0"; 49 } 50 string COuterUserInfo::GetHomeAddress() 51 { 52 COuterUserHomeInfo *pHomeInfo = m_pOuterUser->GetUserHomeInfo(); 53 pHomeInfo->GetHomeAddress(); 54 delete pHomeInfo; 55 pHomeInfo = NULL; 56 return "0"; 57 } 58 string COuterUserInfo::GetMobileNumber() 59 { 60 COuterUserBaseInfo *pBaseInfo = m_pOuterUser->GetUserBaseInfo(); 61 pBaseInfo->GetMobileNumber(); 62 delete pBaseInfo; 63 pBaseInfo = NULL; 64 return "0"; 65 } 66 string COuterUserInfo::GetOfficeTelNumber() 67 { 68 COuterUserOfficeInfo *pOfficeInfo = m_pOuterUser->GetUserOfficeInfo(); 69 pOfficeInfo->GetOfficeTelNumber(); 70 delete pOfficeInfo; 71 pOfficeInfo = NULL; 72 return "0"; 73 } 74 string COuterUserInfo::GetJobPosition() 75 { 76 COuterUserOfficeInfo *pOfficeInfo = m_pOuterUser->GetUserOfficeInfo(); 77 pOfficeInfo->GetJobPosition(); 78 delete pOfficeInfo; 79 pOfficeInfo = NULL; 80 return "0"; 81 } 82 string COuterUserInfo::GetHomeTelNumber() 83 { 84 COuterUserHomeInfo *pHomeInfo = m_pOuterUser->GetUserHomeInfo(); 85 pHomeInfo->GetHomeTelNumber(); 86 delete pHomeInfo; 87 pHomeInfo = NULL; 88 return "0"; 89 }
1 // Adapter.cpp : 定义控制台应用程序的入口点。 2 3 #include "stdafx.h" 4 #include "OuterUserInfo.h" 5 #include "IUserInfo.h" 6 #include "UserInfo.h" 7 8 /* 9 void DoIt(){ 10 IUserInfo* p = new CUserInfo(); 11 p->GetUserName(); 12 p->GetHomeAddress(); 13 p->GetHomeTelNumber(); 14 p->GetJobPosition(); 15 p->GetMobileNumber(); 16 p->GetOfficeTelNumber(); 17 delete p; 18 19 } 20 */ 21 22 void NowDoIt(){ 23 IUserInfo* pYourGirl = new COuterUserInfo(); 24 pYourGirl->GetMobileNumber(); 25 pYourGirl->GetHomeAddress(); 26 pYourGirl->GetHomeTelNumber(); 27 pYourGirl->GetJobPosition(); 28 pYourGirl->GetOfficeTelNumber(); 29 pYourGirl->GetUserName(); 30 delete pYourGirl; 31 32 } 33 34 int _tmain(int argc, _TCHAR* argv[]) 35 { 36 // DoIt(); 37 // cout<<"\n\n"<<endl; 38 NowDoIt(); 39 return 0; 40 }
适配器模式属于结构型模式,当出现数据接口不一致的情况下,才会使用到。例如,之前做过的一个系统,所有的组织结构都是由另一个系统来维护,但我们 开发的系统需要用到这些组织结构,并且在我们的系统里组织结构是只读的。因为系统设计的原因,所以两个系统的结构设计并不一样,正好应用到了适配器模式。
NOTE:Adapter 有class和object两种模式,上面的实现采用的是object 模式,就是使用组合实现的,还有一种是用继承实现的,就是class模式。
详细的可以参考GOF的23种设计模式。
本文转自:~~~