深入解析设计模式中的适配器模式在C++中的运用

 更新时间:2016年03月09日 18:10:51   作者:黄花寒  
这篇文章主要介绍了设计模式中的适配器模式在C++中的运用,通常适配器模式可以细分为类适配器和对象适配器两种情况,需要的朋友可以参考下

适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。
适配器设计模式也并不复杂,适配器它是主要作用是将一个类的接口转换成客户希望的另外一个接口这样使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有两种:1.类的适配器 2.对象适配器,对象适配器更多一些。

示例:比如你在网上买了一个手机,但是买家给你发回来了一个3接头的充电器,但是恰好你又没有3接头的插槽,只有2个接口的插槽,于是你很直然地便会想到去找你个3接口转两接口的转换器。简单的分析下这个转换器便是我们这里的适配器Adapter。三相插头便是我们要适配的Adaptee,两相插类适配器-----在我看来C++的类适配器的用多重继承实现,并提供适配后的接口。

201639180223272.jpg (542×198)

这是你的三相插头

class ThreePhaseOutlet 
{ 
public: 
  void doThreePhasePlugin() 
  { 
    cout<<"三相插头强势插入!"<<endl; 
  } 
}; 

这是你想要的两相插头

class TwoPhaseOutlet  
{ 
public: 
  virtual void doPlugin() = 0; 
}; 

 
然后你将需要找到一个转接头,将三相插头转换为“两相插头”

class OutletConvertor: public TwoPhaseOutlet,public ThreePhaseOutlet 
{ 
public: 
  void doPlugin() 
  { 
    doConvertor(); 
    doThreePhasePlugin(); 
  }   
    void doConvertor() 
  { 
    cout<<"三相插头转为两厢插头!"<<endl; 
  } 
}; 

现在你可以强势插入两相的插口了。

TwoPhaseOutlet* outlet = new OutletConvertor(); 
outlet->doPlugin(); 

对象适配器模式-----对象适配器是将需要适配的对象进行包装然后提供适配后的接口。

201639180653299.jpg (528×198)

对象适配器的 三相插口和转接头的代码和上面一致。只是整合步骤不一致

class OutletConvertor : public TwoPhaseOutlet 
{ 
public: 
  void doPlugin() 
  { 
    doConvertor(); 
    m_out.doThreePhasePlugin(); 
  } 
  void doConvertor() 
  { 
    cout<<"三相插头转为两厢插头!"<<endl; 
  } 
  ThreePhaseOutlet m_out; 
}; 

对象适配器相比类适配器来说更加灵活,他可以选择性适配自己想适配的对象。例如我们下面把代码改成这样,你也许就会明白为什么我这样说:

class OutletConvertor : public TwoPhaseOutlet 
{ 
public: 
  OutletConvertor(ThreePhaseOutlet out) 
  { 
    m_out = out; 
  } 
  void doPlugin() 
  { 
    doConvertor(); 
    m_out.doThreePhasePlugin(); 
  } 
  void doConvertor() 
  { 
    cout<<"三相插头转为两厢插头!"<<endl; 
  } 
  ThreePhaseOutlet m_out; 
}; 

我们在构造的时候将具体需要适配的适配对象传入,这样便可以根据传入不同的对象,从而对该对象进行适配。而类适配器却无法选择对象,他是对整个类进行适配。也就是把所有的三相插口全部转换为两相的,而不是针对某一个。


在以下各种情况下使用适配器模式:

1、 系统需要使用现有的类,而此类的接口不符合系统的需要。
2、 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3、 (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

Adapter模式在实现时有以下这些值得注意的地方:

1、 目标接口可以省略,模式发生退化。但这种做法看似平庸而并不平庸,它可以使Adaptee不必实现不需要的方法(可以参考Default Adapter模式)。其表现形式就是父类实现缺省方法,而子类只需实现自己独特的方法。这有些像模板(Template)模式。
2、 适配器类可以是抽象类。
3、 带参数的适配器模式。使用这种办法,适配器类可以根据参数返还一个合适的实例给客户端。

相关文章

  • C++ LeeCode题目:比特位计数和买卖股票的最佳时机

    C++ LeeCode题目:比特位计数和买卖股票的最佳时机

    这篇文章主要介绍了基于C语言计算比特位计数和买卖股票的最佳时机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-07-07
  • 浅谈C++的几种从键盘输入方式

    浅谈C++的几种从键盘输入方式

    今天小编就为大家分享一篇浅谈C++的几种从键盘输入方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • MATLAB Delaunay算法提取离散点边界的方法

    MATLAB Delaunay算法提取离散点边界的方法

    这篇文章主要为大家详细介绍了MATLAB Delaunay算法提取离散点边界的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C++IO流之fstream, stringstream使用小结

    C++IO流之fstream, stringstream使用小结

    C语言中常用的输入输出函数有如下几种:前者是格式化标准输入输出,后者是格式化文件输入输出,最后是格式化字符串输入输出,这篇文章主要介绍了C++IO流:fstream, stringstream总结,需要的朋友可以参考下
    2022-04-04
  • C++编程中指针的声明与基本使用讲解

    C++编程中指针的声明与基本使用讲解

    这篇文章主要介绍了详解C++编程中C++编程中指针的声明与基本使用讲解,文中举了简单的例子来讲如何在基本的数据结构中使用指针,以及固定和可变指针的介绍,需要的朋友可以参考下
    2016-01-01
  • C++类中的继承实例详解

    C++类中的继承实例详解

    这篇文章主要介绍了C++类中的继承实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 详解C++之C++11的牛逼特性

    详解C++之C++11的牛逼特性

    这篇文章主要介绍了C++之C++11的牛逼特性,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • opencv实现读取视频保存视频

    opencv实现读取视频保存视频

    这篇文章主要为大家详细介绍了opencv实现读取视频保存视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • OpenCV实现给图片添加边框功能

    OpenCV实现给图片添加边框功能

    这篇文章主要为大家详细介绍了OpenCV实现给图片添加边框功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 2~62位任意进制转换方法(c++)

    2~62位任意进制转换方法(c++)

    下面小编就为大家带来一篇2~62位任意进制转换方法(c++)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论