c++/qt设计模式-适配器模式

文章中部分内容和思路来自《Head First设计模式》

模式定义

将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间

模式类图

1.对象适配器:

2.类适配器:

[ps:对象适配器和类适配器使用了两种不同的适配方式,对象适配器使用组合实现适配,类适配器使用继承实现适配]

典型案例

1.案例需求

不同国家的充电头和插座的设计标准不同,例如中国采用两孔扁平的插头和插座,而德国习惯使用三孔圆形插头。假设你只带了两孔扁平的插头去德国出差,而所住的旅馆只有三孔圆形的插头,设计一种方式不改变现有条件的情况下给手机充电。

2.情况分析

如图,我们需要一个额外的设备,该设备需要有两孔扁平插头的插孔(接口)同时也要有三孔圆形插头。

3.代码实现

-------------------

DBSocketInterface.h

-------------------

#ifndef DBSOCKETINTERFACE_H
#define DBSOCKETINTERFACE_H
 
class DBSocketInterface
{
public:
    virtual void powerByRound() = 0;
};
 
#endif // DBSOCKETINTERFACE_H
 

-------------------

GBSocketInterface.h

-------------------

#ifndef GBSOCKETINTERFACE_H
#define GBSOCKETINTERFACE_H
 
class GBSocketInterface
{
public:
    virtual void powerByFlat() = 0;
};
 
#endif // GBSOCKETINTERFACE_H
 

----------

DBSocket.h

----------

#ifndef DBSOCKET_H
#define DBSOCKET_H
 
#include "dbsocketinterface.h"
 
class DBSocket : public DBSocketInterface
{
public:
    DBSocket();
 
public:
    virtual void powerByRound();
};
 
#endif // DBSOCKET_H
 

------------

DBSocket.cpp

------------

#include "DBSocket.h"
 
#include <QDebug>
 
DBSocket::DBSocket()
{
 
}
 
void DBSocket::powerByRound()
{
    qDebug() << "power by round.";
}
 

----------

GBSocket.h

----------

#ifndef GBSOCKET_H
#define GBSOCKET_H
 
#include "GBSocketInterface.h"
 
class GBSocket : public GBSocketInterface
{
public:
    GBSocket();
 
public:
    virtual void powerByFlat();
};
 
#endif // GBSOCKET_H
 

------------

GBSocket.cpp

------------

#include "GBSocket.h"
 
#include <QDebug>
 
GBSocket::GBSocket()
{
 
}
 
void GBSocket::powerByFlat()
{
    qDebug() << "power by flat.";
}
 

 

-------

Hotel.h

-------

#ifndef HOTEL_H
#define HOTEL_H
 
#include "DBSocketInterface.h"
 
class Hotel
{
public:
    Hotel(DBSocketInterface *socket);
 
public:
    void powerForGBMobile(); // 给手机充电
 
public:
    DBSocketInterface *_dbSocket; // 只有圆头
};
 
#endif // HOTEL_H
 

---------

Hotel.cpp

---------

#include "Hotel.h"
 
Hotel::Hotel(DBSocketInterface *dbSocket)
{
    _dbSocket = dbSocket;
}
 
void Hotel::powerForGBMobile()
{
    _dbSocket->powerByRound(); // 看起来使用圆头充电
}
 

-------------------

Round2FlatAdaptor.h

-------------------

#ifndef ROUND2FLATADAPTOR_H
#define ROUND2FLATADAPTOR_H
 
#include "GBSocketInterface.h"
#include "dbsocketinterface.h"
 
class Round2FlatAdaptor : public DBSocketInterface
{
public:
    Round2FlatAdaptor(GBSocketInterface *gbSocket);
 
public:
    virtual void powerByRound();
 
private:
    GBSocketInterface *_gbSocket;
};
 
#endif // ROUND2FLATADAPTOR_H
 

---------------------

Round2FlatAdaptor.cpp

---------------------

#include "Round2FlatAdaptor.h"
 
Round2FlatAdaptor::Round2FlatAdaptor(GBSocketInterface *gbSocket)
{
    _gbSocket = gbSocket;
}
 
void Round2FlatAdaptor::powerByRound()
{
    _gbSocket->powerByFlat();
}
 
 

--------

main.cpp

--------

/**
 * 设计模式-适配器模式
 * 要点:1,已有接口(dbsocket) 2,目标接口(gbsocket) 3,适配器(与已有接口有共同超类,实现依赖目标接口)
 */
#include <QCoreApplication>
 
#include "Hotel.h"
#include "GBSocket.h"
#include "Round2FlatAdaptor.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    GBSocket socket;
    Hotel hotel(new Round2FlatAdaptor(&socket)); // Hotel hotel; hotel.setSocket(dbSocket);
    hotel.powerForGBMobile();
 
    return a.exec();
}
 

 ====================================================================

博主有自己的个人主页啦!请求关注,请求支持。QAQ.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Command line: -prefix /home/liuyh/workspace/qt5.14.2-arm -opensource -confirm-license -release -strip -shared -xplatform linux-arm-gnueabi-g++ -optimized-qmake -c++std c++11 --rpath=no -pch -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtspeech -skip qtsvg -skip qttools -skip qttranslations -skip qtwayland -skip qtwebengine -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -make libs -make examples -nomake tools -nomake tests -gui -widgets -dbus-runtime --glib=no --iconv=no --pcre=qt --zlib=qt -no-openssl --freetype=qt --harfbuzz=qt -no-opengl -linuxfb --xcb=no -tslib --libpng=qt --libjpeg=qt --sqlite=qt -plugin-sql-sqlite -I/opt/tslib/include -L/opt/tslib/lib -recheck-all executing config test machineTuple + arm-linux-gnueabi-g++ -dumpmachine > sh: 1: arm-linux-gnueabi-g++: not found test config.qtbase.tests.machineTuple FAILED executing config test verifyspec + cd /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/config.tests/verifyspec && /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/bin/qmake "CONFIG -= qt debug_and_release app_bundle lib_bundle" "CONFIG += shared warn_off console single_arch" 'QMAKE_LIBDIR += /opt/tslib/lib' 'INCLUDEPATH += /opt/tslib/include' -early "CONFIG += cross_compile" /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/config.tests/verifyspec + cd /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/config.tests/verifyspec && MAKEFLAGS= /usr/bin/make clean && MAKEFLAGS= /usr/bin/make > rm -f verifyspec.o > rm -f *~ core *.core > arm-linux-gnueabi-g++ -c -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard -pipe -O2 -w -fPIC -I/home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/config.tests/verifyspec -I. -I/opt/tslib/include -I/home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/mkspecs/linux-arm-gnueabi-g++ -o verifyspec.o /home/liuyh/workspace/QT5.14.2/qt-everywhere-src-5.14.2/qtbase/config.tests/verifyspec/verifyspec.cpp > make:arm-linux-gnueabi-g++:命令未找到 > make: *** [Makefile:172:verifyspec.o] 错误 127
06-09

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperYang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值