适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一。
就是这种一个图:
比方我们有这种一个旧的类:
class OldName { public: virtual void setName(string n) = 0; virtual string getName() = 0; }; class OldNameMetheds : public OldName { string name; public: OldNameMetheds(string n = "") : name(n) { } void setName(string n) { name = n; } string getName() { return name; } };
这样我们仅仅能设计一个字符串的名字。可是如今我们有一个新的类:
//base class class NewName { public: virtual void setFirstName(string first) = 0; virtual void setLastName(string last) = 0; virtual string getFirstName() = 0; virtual string getLastName() = 0; }; class NewNameMethod : public NewName { protected: string first_name; string last_name; public: NewNameMethod(string first = "", string last = "") : first_name(first), last_name(last) { } void setFirstName(string first) { first_name = first; } void setLastName(string last) { last_name = last; } string getFirstName() { return first_name; } string getLastName() { return last_name; } };
旧类和新类就不兼容了。故此须要一个Adaptor接口类:
//The real adaptor class class Old2NewNameAdaptor : public NewNameMethod { OldName *old; public: Old2NewNameAdaptor(OldName *o) : old(o) { string name = old->getName(); unsigned i = 0; for (; i < name.size() && name[i] != ' '; i++) { first_name.push_back(name[i]); } for (i++; i < name.size(); i++) last_name.push_back(name[i]); } };
能够看到。该类继承了新类,而且自己主动处理了oldname,把oldname的内容转存进newname中了,中间就是多了一个自己主动转换的功能,并没有太多奇妙的东西。可是对于用户来说就方便非常多啦。
然后能够这样使用:
void Adaptor_Run() { OldName *oldname = &OldNameMetheds(); oldname->setName("Bill Gate"); //小心这样写会有错误:原来的名字就会变成空了。没保留NewName *old2new = &Old2NewNameAdaptor(oldname);原因:应该是由于这个是暂时变量。指针指向一个空的暂时变量。那么是没有数据的!Old2NewNameAdaptor o2n(oldname); NewName *old2new = &o2n;//这样写。结果正确! cout<<"The first name is: "<<old2new->getFirstName()<<endl <<"The last name is : "<<old2new->getLastName()<<endl; }
这里的old2new是一个新类,能够使用这个新类操作旧类的数据了。
最后执行: