设计模式之一——Adapter模式

在看23种设计模式之前,我们首先了解一下设计原则。
面向对象的设计原则有以下8个:
1.依赖倒置原则
高层模块(稳定)不应依赖于低层模块(变化),二者都应该依赖于抽象(稳定);抽象(稳定)不应依赖于实现细节(变化)。
2.开放封闭原则
对扩展开放,对过呢更改封闭。类模块应该是可扩展的,但是不可修改。
3.单一职责原则
一个类应该仅有一个引起它变化的原因。
4.替换原则
子类必须能够替换它们的基类(is-a)。
5.接口隔离原则
6.优先使用对象组合,而不是类继承
7.封装变化点
8.针对接口编程,而不是针对实现编程
减少各部分的依赖关系,实现“高内聚、低耦合”。
综上我们可以总结为:
由静态——到动态
由早绑定——到晚绑定
由继承——到组合
由编译时依赖——到运行时依赖
由紧耦合——到松耦合
接下来我们来看Adapt模式:
Adapter模式其实就是将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能在在一起工作的那些类可以一起工作。
在代码的实现中,我们常常希望旧的接口不要改动,又能适应新的目标接口。其中适配器有两种:类适配器和对象适配器。类适配器采用多继承的方法,一般不推荐,它不具有灵活性;对象适配器采用对象组合的方法,比较常用。
下面我们采用对象适配器的方法进行一个举例:
一、首先第一步建一个 ITarget的类,是我们的新接口,itarget.h如下:

#ifndef ITARGET_H
#define ITARGET_H

//目标接口(新接口)
class ITarget
{
public:
    ITarget();
    virtual void request();
};
#endif // ITARGET_H

itarget.cpp如下:

#include "itarget.h"
#include <QDebug>
ITarget::ITarget()
{

}

 void ITarget::request()
{
    qDebug()<<"目标接口";

}

二、然后建一个 IAdaptee的类,是我们要适配的旧接口,iadaptee.h如下:

#ifndef IADAPTEE_H
#define IADAPTEE_H


class IAdaptee
{
public:
    IAdaptee();
    virtual void specificRequest();//旧接口
};

class IAdapteeA:public IAdaptee   //因为旧接口不一定只有一个类,可能还有一些继承于旧接口的多种类
{
public:
    virtual void specificRequest();
};

class IAdapteeB:public IAdaptee
{
public:
    virtual void specificRequest();
};
#endif // IADAPTEE_H

iadaptee.cpp如下:

#include "iadaptee.h"
#include <QDebug>
IAdaptee::IAdaptee()
{

}


 void IAdaptee::specificRequest()
{
    qDebug()<<"需要适配的接口";
}


 void IAdapteeA::specificRequest()
{
    qDebug()<<"需要适配的接口A";
}

 void IAdapteeB::specificRequest()
{
    qDebug()<<"需要适配的接口B";
}

三、建立适配器类Adapter,既有继承又有组合,adapter.h如下:

#ifndef ADAPTER_H
#define ADAPTER_H

#include "itarget.h"
#include "iadaptee.h"
class Adapter:public ITarget//这一步采用继承新接口目标类
{
public:
    Adapter(IAdaptee *pAdaptee);
    virtual void request() ;

protected:
   IAdaptee *pAdaptee;//这一步采用了组合,组合了旧接口

};

#endif // ADAPTER_H

adapter.cpp如下:

#include "adapter.h"
#include <QDebug>
Adapter::Adapter(IAdaptee *pAdaptee)
{
    this->pAdaptee = pAdaptee;

}
void Adapter::request()
{
    qDebug()<<"对象适配器";
    pAdaptee->specificRequest();

}

四、在main.cpp中进行调用:

#include "iadaptee.h"
#include"itarget.h"
#include "adapter.h"
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    IAdaptee *pAdapteeA = new IAdapteeA();
    ITarget *pTarget1 = new Adapter(pAdapteeA);
    pTarget1->request();

    IAdaptee *pAdapteeB = new IAdapteeB();
    ITarget *pTarget2 = new Adapter(pAdapteeB);
    pTarget2->request();

    return a.exec();
}

五、输出结果
执行main 函数后的输出结果
这样我们利用新接口调用了旧接口,输出了旧的内容,完成了适配。

六、对象适配器的实现思路可以表示为:
对象适配器的实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值