• C++结构型模式-适配器模式


    1.1 基本概念

    适配器模式(Adapter Pattern):或称为包装器(Wrapper)将一个接口转换为客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,

    适配器模式包括类适配器和对象适配器。

    1.2 模式结构

    1、Target(目标抽象类) :目标抽象类定义客户要用的特定领域的接口,可以是个抽象类或接口,也可以是个具体类;

    2、Adapter(适配器类):可以调用另一个接口,作为一个转换器,对适配者类和目标抽象类进行适配。

    (1)类适配器中,适配器类通过实现Target接口并继承 Adaptee类,使得两者产生联系;

    (2)对象适配器类中,适配器类通过继承Target,并关联一个Adaptee对象使两者产生联系;

    3、Adaptee (适配者类)

    被适配的角色,它定义了一个已经存在的接口,这个接口需要适配。

    4、Client(客户类)

    针对目标抽象类进行编程,调用在抽象目标类中定义的业务方法。

    (1)类适配器模式结构:适配器类Adapter,实现了抽象目标类(Target)接口,并继承了适配者类(Adaptee),在适配器类 的request()方法中调用所继承的适配者类(Adaptee)的SpeaificRequest()方法,实现了适配的目的。

    (2)对象适配器模式结构

     为了使客户端能够使用适配者类Adapte 的 spcificRequest()方法,需要提供一个适配器类Adapter,这个适配器类包装了一个适配者的实例,从而将客户端和适配者衔接起来,在适配器的request()方法中调用适配者的 spcificRequest()方法。适配器类和适配者类为关联关系。

    1.3 优缺点

    优点:

    1. 将目标类和适配器类解耦。通过引入一个适配器类来重用现有的适配者类,而无须修改原有的代码。
    2. 增加了类的透明性和复用性,将具体的实现封装在适配器类中,对于客户端类来说是透明的,而且提高了适配器的复用性。
    3. 灵活性和扩展性都非常好,符合开闭原则

    缺点:

    1. 一次最多只能适配一个适配器类,不能同时适配多个适配器。
    2. 适配器类不能为最终类。
    3. 目标抽象类只能为接口,不能为类,其使用有一定的局限性。

    1.4 应用场景

    (1)系统需要使用现有的类,而这些类的接口不符合系统的需求;

    (2)数据库链接工具JDBC,使得使用Java语言程序能够与数据库链接,并使用SQL语言来查询和操作数据库。

    1.5 实例

    1.5.1 类适配器模式

    设计一个可以模拟各种动物的机器人,在机器人中定义了一系列方法,如机器人叫喊 cry()方法,机器人移动方法 move,现在在不修改已有代码的情况下,使得机器人能够像狗一样,叫 wang()和跑 move()

    1. #include
    2. using namespace std;
    3. /*目标抽象类RobotTarget 机器人接口*/
    4. class RobotTarget{
    5. public:
    6. RobotTarget(){};
    7. virtual void cry()=0;
    8. virtual void move()=0;
    9. ~RobotTarget(){};
    10. };
    11. /*适配者类 DogAdaptee*/
    12. class DogAdaptee{
    13. public:
    14. DogAdaptee(){}
    15. virtual void wang()
    16. {
    17. cout<<"wang wang"<
    18. }
    19. virtual void run()
    20. {
    21. cout<<"run run"<
    22. }
    23. };
    24. /*适配器类 仿生狗 DogAdapter*/
    25. class DogAdapter: public RobotTarget, public DogAdaptee{
    26. public:
    27. DogAdapter(){};
    28. virtual void cry()
    29. {
    30. wang();
    31. }
    32. virtual void move()
    33. {
    34. run();
    35. }
    36. };
    37. int main()
    38. {
    39. //对象适配器
    40. RobotTarget* robot= new DogAdapter();
    41. robot->cry();
    42. robot->move();
    43. delete robot;
    44. return 0;
    45. }

    1.5.2 对象适配器模式

    英式插座与中式插座规格不同,如何在不修改英式插座的基础上转换为中式插座。

    1. #include
    2. #include
    3. using namespace std;
    4. //目标抽象类 CCnOutlet中式插座
    5. class CCnOutlet
    6. {
    7. public:
    8. virtual ~CCnOutlet()
    9. {
    10. }
    11. virtual void Cnplug() = 0;
    12. };
    13. //适配者类 CEnOutlet
    14. class CEnOutlet
    15. {
    16. public:
    17. virtual ~CEnOutlet()
    18. {
    19. }
    20. virtual void Enplug()
    21. {
    22. cout << "British socket!" << endl;
    23. }
    24. };
    25. //适配器类
    26. class CCnOutletAdapter : public CCnOutlet
    27. {
    28. public:
    29. CCnOutletAdapter(CEnOutlet *pEnOutlet) : m_pEnOutlet(pEnOutlet){};
    30. virtual ~CCnOutletAdapter(){};
    31. virtual void Cnplug()
    32. {
    33. m_pEnOutlet->Enplug();
    34. cout << "adapter" << endl;
    35. }
    36. private:
    37. CEnOutlet *m_pEnOutlet;
    38. };
    39. int main(int argc, char **argv)
    40. {
    41. CEnOutlet *pEnOutlet = new CEnOutlet;
    42. CCnOutlet *pCnOutlet = new CCnOutletAdapter(pEnOutlet);
    43. //英式插座适配中式插座
    44. pCnOutlet->Cnplug();
    45. delete pEnOutlet;
    46. delete pCnOutlet;
    47. return 0;
    48. }

    参考文献:

    【1】https://www.jianshu.com/p/b8d3142772e0

    【2】C++设计模式-Adapter适配器模式(转) 

    【3】C++设计模式3-适配器模式Adapter | Veaxen's 

  • 相关阅读:
    mybatis执行sql流程
    利用Jpom在线构建Spring Boot项目
    业界新标杆!阿里开源自研高并发编程核心笔记(2022 最新版)
    第6章 Elasticsearch,分布式搜索引擎
    javaee spring aop 注解实现
    【Node.js+koa--后端管理系统】设计标签创建、查询、接口 | 标签绑定到动态
    【老生谈算法】matlab实现LSB算法水印算法源码——LSB算法
    黑马苍穹外卖前端求解
    Qt自定义菜单
    物流工业三防平板实时跟踪货物位置和状态
  • 原文地址:https://blog.csdn.net/kenjianqi1647/article/details/126757307