GoF设计模式——适配器模式(C++实现)

🍞概念

适配器模式(Adapter Pattern)为两个不兼容的接口之间提供了桥梁。它结合了两个独立接口的功能,这种类型的设计模式属于结构型模式。

🍔使用场景

当希望使用某个类(第三方类), 但是其接口与客户端所期待的不兼容时, 可以使用适配器类。把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。举个生活中的例子,一个不懂英文的中国人要和美国人沟通,这时候就需要一个翻译者,这个翻译者充当的就是适配器角色。

🍟具体的情形

如果我们实现了一个人脸检测的类,提供了接口给客户端调用。之后想要替换成第三方库人脸识别类,但是第三方库提供的接口和之前的不一致。那么就可以采用适配器模式将第三方库变换成客户端所期待的接口。
在这里插入图片描述

🧀模式的组成结构

目标(Target)接口:当前系统业务所期待的接口。
适配者(Adaptee)类:它是被访问和适配的第三方现存组件库中的组件接口。
适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

class MyClass
{
public:
    virtual void identifyizefaces(){qDebug()<<"MyClass face";}
};


class ThirdParty
{
public:
    void recognizeFaces() {qDebug()<<"ThirdParty face";}
};


class Adapter : public MyClass
{
public:
    Adapter(ThirdParty* thirdParty){m_thirdParty = thirdParty;};
    void identifyizefaces(){
       if(m_thirdParty)
       {
           m_thirdParty->recognizeFaces();
       }
    }

private:
    ThirdParty *m_thirdParty = nullptr;

};

int main(int argc, char *argv[])
{
    //原先的调用方式
    MyClass *target = new MyClass();
    target->identifyizefaces();

    //适配之后的调用方式
    ThirdParty *adaptee = new ThirdParty();
    MyClass *adapter = new Adapter(adaptee);
    adapter->identifyizefaces();

    delete target;
    delete adaptee;
    delete adapter;
    return 0;
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
写完了Interpreter模式之后,我习惯性的看看下一天的安排,却陡然发现GoF的23个设计模式的解析已经在我不经意间写完了。就像在一年前看GoF的《设计模式》一书,和半年前用C++模拟、实现23种经典的设计模式一般,透过这个写解析的过程,我又看到了另外一个境界。一直认为学习的过程很多时候可以这样划分:自己学会一门知识(技术)、表达出来、教会别人、记录下来,虽然这个排序未必对每个人都合适(因为可能不同人有着不同的特点能力)。学一门知识,经过努力、加以时日,总是可以达到的,把自己学的用自己的话表达出来就必须要将学到的知识加以消化、理解,而教会一个不懂这门知识的人则比表达出来要难,因为别人可能并不是适应你的表述方式,记录下来则需要经过沉淀、积累、思考,最后厚积薄发,方可小成。 设计模式之于面向对象系统的设计和开发的作用就有如数据结构之于面向过程开发的作用一般,其重要性和必要性自然不需要我赘述。然而学习设计模式的过程却是痛苦的,从阅读设计模式的圣经——GoF的《设计模式:可复用面向对象软件的基础》时的枯燥、苦闷、茫无头绪,到有一天突然有一种顿悟;自己去实现GoF的23中模式时候的知其然不知其所以然,并且有一天在自己设计的系统种由于设计的原因让自己苦不堪言,突然悟到了设计模 第 2 页 共 105 页 k_eckel 设计模式精解-GoF 23 种设计模式解析附 C++实现源码 http://www.mscenter.edu.cn/blog/k_eckel 式种的某一个正好可以很好的解决问题,到自己设计的elegant的系统时候的喜悦与思考;一直到最后向别人去讲解设计模式,别人向你咨询设计模式,和别人讨论设计模式。就如GoF在其前言中说到:一旦你理解了设计并且有了一种“Aha!”(而不是“Huh?”)的应用经验和体验后,你将用一种非同寻常的方式思考面向对象设计。这个过程我认为是漫长的,painful,但是是非常必要的。经过了的才是自己的,Scott Mayer在其巨著《Effective C++》就曾经说过:C++老手和C++新手的区别就是前者手背上有很多伤疤。是的在软件开发和设计的过程中,失败、错误是最好的老师,当然在系统开发中,失败和错误则是噩梦的开端和结束,因为你很难有改正错误的机会。因此,尽量让自己多几道疤痕是对的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值