//适配器模式
//这像一个补救模式,类A的接口无法与类C不匹配;便构建一个类B,让A与B匹配,B与C匹配。
//作者用的示例:人力资源管理
//虚化 员工信息接口 类:A
class IUserInfo {
public:
virtual string GetUserName() = 0;
virtual string GetHomeAddress() = 0;
virtual string GetMobileNumber() = 0;
virtual string GetOfficeTelNumber() = 0;
virtual string GetJobPosition() = 0;
virtual string GetHomeTelNumber() = 0;
};
typedef map<string, string>* p_map_str;
typedef map<string, string> map_str;
//劳动服务公司的人员信息接口 类:C
class IOuterUser {
public:
virtual p_map_str GetUserBaseInfo() = 0;
virtual p_map_str GetUserOfficeInfo() = 0;
virtual p_map_str GetUserHomeInfo() = 0;
};
//人员信息实现
class OuterUser : public IOuterUser {
public:
p_map_str GetUserBaseInfo() {
p_map_str pmapstr = new map_str;
pmapstr->insert(make_pair("userName", "这个员工叫XXX"));
pmapstr->insert(make_pair("mobileNumber", "这个员工电话是XXXX"));
return pmapstr;
}
p_map_str GetUserHomeInfo() {
p_map_str pmapstr = new map_str;
pmapstr->insert(make_pair("homeTelNumber", "这个员工家庭电话是xxx"));
pmapstr->insert(make_pair("homeAddress", "这个员工家庭地址XXX"));
return pmapstr;
}
p_map_str GetUserOfficeInfo() {
p_map_str pmapstr = new map_str;
pmapstr->insert(make_pair("jobPosition", "这个员工职位是xxx"));
pmapstr->insert(make_pair("officeTelNumber", "这个员工办公电话XXX"));
return pmapstr;
}
};
//中转角色 类:B
class OuterUserInfo : public OuterUser, public IUserInfo {
private:
p_map_str m_baseinfo;
p_map_str m_homeinfo;
p_map_str m_officeinfo;
public:
OuterUserInfo(): m_baseinfo(GetUserBaseInfo()),
m_homeinfo(GetUserHomeInfo()),
m_officeinfo(GetUserOfficeInfo()) {}
string GetHomeAddress() {
string homeaddress = m_homeinfo->find("homeAddress")->second;
cout << homeaddress;
return homeaddress;
}
string GetHomeTelNumber() {
string hometelnumber = m_homeinfo->find("homeTelNumber")->second;
cout << hometelnumber;
return hometelnumber;
}
string GetJobPosition() {
string jobposition = m_officeinfo->find("jobPosition")->second;
cout << jobposition;
return jobposition;
}
string GetOfficeTelNumber() {
string officetelnumber = m_officeinfo->find("officeTelNumber")->second;
cout << officetelnumber;
return officetelnumber;
}
string GetMobileNumber() {
string mobilenumber = m_baseinfo->find("mobileNumber")->second;
cout << mobilenumber;
return mobilenumber;
}
string GetUserName() {
string username = m_baseinfo->find("userName")->second;
cout << username;
return username;
}
};
class Client {
public:
static void main() {
IUserInfo* young = new OuterUserInfo;
for (int i = 0; i < 10; i++) {
young->GetMobileNumber();
}
}
};
//适配器模式基本是开发阶段遇到的补救方法吧,我想!
//实际的代码还是包装。和修饰模式一样,为了包装
//设计时候,不需!