C++设计模式之适配器模式(Adapter)

 更新时间:2018年03月28日 11:37:23   作者:返回主页 chencarl  
这篇文章主要为大家详细介绍了C++设计模式之适配器模式Adapter,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

适配器模式顾名思义在于接口的转换,最形象的例子就如两口转三口电源适配器,口子的数量可以理解为参数数量,一如我们调用三个参数的接口,而提供的接口只有两个参数,那么久需要适配器类进行接口的扩展改造,这就是适配器模式存在的最主要意义。

作用

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。

类视图

类模式适配器

对象模式适配器

代码实现

//目标接口类,客户需要的接口
class Target
{
public:
  Target(){}
  virtual ~Target(){}
  virtual void Request()//定义新的标准接口
  {
    cout << "Request" << endl;
  }
};

//需要适配的类
class Object
{
public:
  Object(){}
  ~Object(){}
  void SpecificRequest()
  {
    cout << "SpecificRequest" << endl;
  }
};

//类模式,适配器类,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果
class Adapter :public Target, private Object
{
public:
  Adapter(){}
  ~Adapter(){}
  virtual void Request()//实现Target定义的Request接口
  {
    cout << "AdapterRequest" << endl;
    this->SpecificRequest();
    cout << "----------------------------" << endl;
  }
};

//对象模式,适配器类,继承Target类,采用组合的方式实现Object的复用
class Adapter1 :public Target
{
public:
  Adapter1(Object* adaptee) :_adaptee(adaptee)
  {}
  Adapter1() :_adaptee(new Object)
  {}
  ~Adapter1(){}
  virtual void Request()//实现Target定义的Request接口
  {
    cout << "Adapter1Request" << endl;
    _adaptee->SpecificRequest();
    cout << "----------------------------" << endl;
  }
private:
  Object* _adaptee;
};

//client调用
int main()
{
  //类模式Adapter
  Target* pTarget = new Adapter();
  pTarget->Request();

  //对象模式Adapter1
  Adaptee* ade = new Adaptee();
  Target* pTarget1= new Adapter1(ade);
  pTarget1->Request();

  //对象模式Adapter2
  Target* pTarget2 = new Adapter1();
  pTarget2->Request();

  return 0;
}

在Adapter模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。在C++中的public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果(private继承后,父类中的接口都变为private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果,但是在C++中pure virtual function也可以提供默认实现,因此这是不纯正的接口继承,但是在Java中我们可以interface来获得真正的接口继承了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 浅谈C++函数声明后面加throw()的作用(必看)

    浅谈C++函数声明后面加throw()的作用(必看)

    下面小编就为大家带来一篇浅谈C++函数声明后面加throw()的作用(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C语言学习之函数知识总结

    C语言学习之函数知识总结

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。本文就为大家详细讲讲C语言中函数的相关知识点,希望有所帮助
    2022-07-07
  • 基于C++执行内存memcpy效率测试的分析

    基于C++执行内存memcpy效率测试的分析

    本篇文章对C++中执行内存memcpy的效率进行了分析测试。需要的朋友参考下
    2013-05-05
  • 常用Hash算法(C语言的简单实现)

    常用Hash算法(C语言的简单实现)

    下面小编就为大家带来一篇常用Hash算法(C语言的简单实现)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • C++运算符重载实例代码详解(调试环境 Visual Studio 2019)

    C++运算符重载实例代码详解(调试环境 Visual Studio 2019)

    这篇文章主要介绍了C++运算符重载实例(调试环境 Visual Studio 2019),本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 解析C语言结构体及位段

    解析C语言结构体及位段

    今天小编就为大家分享一篇关于解析C语言结构体及位段,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++运算符重载的详细讲解

    C++运算符重载的详细讲解

    这篇文章主要给大家介绍了关于C++运算符重载的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C++ 指向类成员的指针

    C++ 指向类成员的指针

    指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员)
    2020-03-03
  • C++ 使用getline()从文件中读取一行字符串方法示例

    C++ 使用getline()从文件中读取一行字符串方法示例

    这篇文章主要介绍了C++ 使用getline()从文件中读取一行字符串方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • C++静态变量,常量的存储位置你真的了解吗

    C++静态变量,常量的存储位置你真的了解吗

    这篇文章主要介绍了C++中静态变量与常量的存储位置的相关资料,需要的朋友可以参考下,希望能够给你带来帮助
    2021-08-08

最新评论