UML

点击查看【processon】
需求场景
User想使用Apatee的功能,但是很麻烦,可能是因为接口不兼容,比如参数类型,数量等不匹配,每次调用都要做很多重复工作。
解决(适配器模式)

  • 1、定义User想要的接口
    • 即定义Target抽象类,里面包含想要的纯虚函数。
  • 2、实现User想要的接口
    • 即定义Adapter具体类,继承Target,同时这个Adapter要获得Adaptee的功能,再才“有数据”去实现Target接口,获得途径有两种:
      • Adapter继承Adaptee,直接获得Adaptee的功能。
      • Adapter有一个Adaptee成员对象,间接获得Adaptee的功能。
  • 3、User使用接口
    • User只需要获得一个Target类型对象就可以,而这个Target类型其实是一个Adapter实例,但User不需要知道,在代码上的体现就是User只需要一个Target基类指针变量,基类指针可以指向子类Adapter的实例。

      代码设计

      假设需求:
      User想要add(str, str),但是目前已有功能是Adaptee的add(int, int)。 ```cpp /**目前已有功能**/ struct Adaptee{ int add(int a, int b){ return a + b; } }

/**按照上面的解决步骤**/ //第一步,定义User想要的接口,定义抽象类 struct UserInterface{ virtual int add(const string&, const string&) = 0; };

//第二步,实现User想要的接口,继承抽象类,同时通过继承Adaptee获得功能。 struct Adapter : UserInterface, Adaptee{ int add(const string &a, const string &b){ //把string转成int,就是适配工作。这里假设假设数据不会触发异常。 return add(stoi(a) + stoi(b))

  1. }

} //第三步:User使用接口 struct User{ int fuck(const UserInterface& interface){ //在User眼里,只有接口,不关注具体是谁。 string data1 = “1”, data2 = “2”; //假设这是User获得的数据 return interface.add(data1, data2); } }

int main(){ Adapter adapter; User usr; const UserInterface &interface = adapter;

  1. usr.fuck(interface)

} ```