适配器模式(Adapter)——结构型模式

适配器模式(Adapter)------结构型模式

什么是适配器模式?

适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。

举一个经典的"方钉、圆钉、圆孔"问题例子:

适配器假扮成一个圆钉 (Round­Peg), 其半径等于方钉 (Square­Peg) 横截面对角线的一半 (即能够容纳方钉的最小外接圆的半径)。

总结:

圆孔类 只对圆钉类 开放了测试接口,现在方钉类 也想用圆孔类的接口,在不修改圆孔类的前提下,如何修改?

写一个适配器类伪装成(继承)圆钉类,实际内部是方钉类(包含方钉类对象并重写圆钉类方法)。

cpp 复制代码
/*************************************************************************
        > File Name: adapter.cpp
        > Author:
        > Mail:
        > Created Time: Thu Mar 14 10:01:03 2024
 ************************************************************************/

#include <iostream>
#include <cmath>

using namespace std;

class RoundPeg {
private:
    int radius;
public:
    RoundPeg() = default;
    RoundPeg(int r) : radius(r) {}
    virtual int getRadius() {
        return this->radius;
    }
};

class RoundHole {
private:
    int radius;
public:
    RoundHole(int r) : radius(r) {}
    int getRadius() {
        return this->radius;
    }
    bool fits(RoundPeg &peg) {
        return peg.getRadius() <= this->radius;
    }
};

class SquarePeg {
private:
    int width;
public:
    SquarePeg(int w) : width(w) {}
    SquarePeg(const SquarePeg &obj) {
        width = obj.width;
    }
    int getWidth() {
        return this->width;
    }
};

class SquarePegAdapter : public RoundPeg {
private:
    SquarePeg peg;
public:
    SquarePegAdapter(SquarePeg &obj) : peg(obj) {}
    int getRadius() override {
        return peg.getWidth() * sqrt(2) / 2;
    }
};


int main() {
    RoundHole hole(20);

    RoundPeg r_peg1(20);
    RoundPeg r_peg2(21);
    cout << hole.fits(r_peg1) << endl; // 1
    cout << hole.fits(r_peg2) << endl; // 0

    SquarePeg s_peg1(20);
    SquarePeg s_peg2(21);
    SquarePegAdapter s_adapter1(s_peg1);
    SquarePegAdapter s_adapter2(s_peg2);
    cout << hole.fits(s_adapter1) << endl; // 1
    cout << hole.fits(s_adapter2) << endl; // 1

    return 0;
}
相关推荐
汉克老师4 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
c++·算法·蓝桥杯·01背包·蓝桥杯c++·c++蓝桥杯
Mr_Xuhhh5 小时前
项目需求分析(2)
c++·算法·leetcode·log4j
PAK向日葵6 小时前
【C/C++】面试官:手写一个memmove,要求性能尽可能高
c语言·c++·面试
Jared_devin7 小时前
二叉树算法题—— [蓝桥杯 2019 省 AB] 完全二叉树的权值
数据结构·c++·算法·职场和发展·蓝桥杯
搞全栈小苏7 小时前
基于Qt QML和C++的MQTT测试客户端(CMakeLists实现)
xml·c++·qt
啊?啊?7 小时前
18 从对象内存到函数调用:C++ 虚函数表原理(继承覆盖 / 动态绑定)+ 多态实战
开发语言·c++·多态原理
bkspiderx7 小时前
C++标准库:文件流类
开发语言·c++
一拳一个呆瓜7 小时前
【MFC】对话框属性:X Pos(X位置),Y Pos(Y位置)
c++·mfc
一拳一个呆瓜8 小时前
【MFC】对话框属性:Center(居中)
c++·mfc
hai_qin8 小时前
十三,数据结构-树
数据结构·c++