在看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();
}
五、输出结果
这样我们利用新接口调用了旧接口,输出了旧的内容,完成了适配。
六、对象适配器的实现思路可以表示为: