服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 深入解析设计模式中的适配器模式在C++中的运用

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

2021-03-26 14:50黄花寒 C/C++

这篇文章主要介绍了设计模式中的适配器模式在C++中的运用,通常适配器模式可以细分为类适配器和对象适配器两种情况,需要的朋友可以参考下

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

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

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

这是你的三相插头

?
1
2
3
4
5
6
7
8
class ThreePhaseOutlet
{
public:
  void doThreePhasePlugin()
  {
    cout<<"三相插头强势插入!"<<endl;
  }
};

这是你想要的两相插头

?
1
2
3
4
5
class TwoPhaseOutlet 
{
public:
  virtual void doPlugin() = 0;
};

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class OutletConvertor: public TwoPhaseOutlet,public ThreePhaseOutlet
{
public:
  void doPlugin()
  {
    doConvertor();
    doThreePhasePlugin();
  }  
    void doConvertor()
  {
    cout<<"三相插头转为两厢插头!"<<endl;
  }
};

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class OutletConvertor : public TwoPhaseOutlet
{
public:
  void doPlugin()
  {
    doConvertor();
    m_out.doThreePhasePlugin();
  }
  void doConvertor()
  {
    cout<<"三相插头转为两厢插头!"<<endl;
  }
  ThreePhaseOutlet m_out;
};

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16