您的位置:首页 > 编程语言 > Qt开发

设计模式 适配器模式

2011-09-12 09:59 148 查看
1、cnoutlet.h

#ifndef CNOUTLET_H
#define CNOUTLET_H

#include <iostream>
#include <string>
using namespace std;

class CNOutlet //适配器基类Target, 中式插座
{
public:
CNOutlet(){};
~CNOutlet(){};
virtual void CNUsePlug(){};
};

#endif // CNOUTLET_H
2-1、enplug.h

#ifndef ENPLUG_H
#define ENPLUG_H

#include <iostream>
#include <string>
using namespace std;

class ENPlug //适配者Adaptee, 英式插头
{
public:
ENPlug(){};
~ENPlug(){};
void UsePlug();
};

#endif // ENPLUG_H
2-2、enplug.cpp

#include "enplug.h"

void ENPlug::UsePlug()
{
cout << "use an english plug" << endl;
}
3-1、adapterforenplug.h

#ifndef ADAPTERFORENPLUG_H
#define ADAPTERFORENPLUG_H

#include "cnoutlet.h"
#include "enplug.h"

#include <iostream>
#include <string>
using namespace std;

class AdapterForENPlug : public CNOutlet //适配器Adapter. 使用对象适配器方式
{
public:
AdapterForENPlug(ENPlug *pENPlug);
~AdapterForENPlug(){};
void CNUsePlug();
private:
ENPlug* m_pENPlug;
};

#endif // ADAPTERFORENPLUG_H
3-2、adapterforenplug.cpp

#include "adapterforenplug.h"

AdapterForENPlug::AdapterForENPlug(ENPlug *pENPlug)
:m_pENPlug(pENPlug)
{

}

void AdapterForENPlug::CNUsePlug()
{
cout << "adapter transfer for enplug ..." << endl;
m_pENPlug->UsePlug();
}
4、main.cpp
/*
作者:jhluroom弹   QQ:454676244  MSN:jhlu0815@hotmail.com
开发IDE:qt creater
开发环境:QT C++
参考网站:神秘果:http://www.shenmiguo.com/

定义:
将一个类的接口转换成客户希望的另外一个接口。适配器(Adapter)模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
也叫包装器(Wrappter)。主要有“类适配器”和“对象适配器”两种方式。

理解:
1.Target是供Client调用的抽象基类。
2.Adaptee是需要适配的类(适配者类)。Adaptee的方法(SpecificRequest)与Target的方法(Request)是不兼容的。
3.Adapter是适配器类。完成对Target和Adaptee的接口适配工作。Adapter重新实现Request方法,
内部隐藏了调用Adaptee不兼容方法(SpecificRequest)的细节。
4."类适配器",是通过继承类适配者类(Adaptee)实现的。类适配器实现客户类所需要的方法(SpecificRequest)。
当客户对象调用适配器类(Adapter)方法的时候,适配器内部调用它所继承的适配者的方法。
5."对象适配器",包含一个适配器者的引用,与类适配器相同,对象适配器也实现了客户类需要的接口。
当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。
对象组合方式,允许一个Adapter适配多个Adaptee。

要点:
1.适配器模式适用于:
你想使用一个已经存在的类,而它的接口不符合你的需求。
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口,对象适配器可以适配它的父类接口。
2.使用"类适配器"时,Adapter类使用public方式继承Target类,并使用private方式继承Adaptee类。
这样,Adapter是Target子类型,但不是Adaptee子类型。如此这般,推荐使用"对象适配器"方式。
3.适配器模式与桥接(Bridge)模式的区别:
桥接模式的目的是将接口部分与实现分离,从而使它们能相对独立的改变;桥接是设计阶段行为。
适配器模式是对已有接口的改变,使得功能相同但接口不兼容的类桥接在一起。

应用:
以下源码说明如下:理论上中是中国的插座上只能用中国的插头,但,现在有一个英国的插头,想插在中国的插座上,
这样就为英国的插头做了一个适配层,好放在中国的插座上用;比如,这时又来了一个法国的插头,则用同样的方法即可。

以上文字说明,从网上整理而来,有可能部分与其他同仁相同,请谅解,希望我们能够共同交流,谢谢!
*/

#include <QtCore/QCoreApplication>

#include "cnoutlet.h"
#include "enplug.h"
#include "adapterforenplug.h"

int main(int argc, char *argv[])
{
cout << "=== jhluroom start ========" << endl;

//适配者当作参数传递给适配器,完成适配过程
ENPlug* pENPlug = new ENPlug;
CNOutlet *pCNOutlet = new AdapterForENPlug(pENPlug);
pCNOutlet->CNUsePlug();

delete pENPlug;
delete pCNOutlet;

cout << "=== jhluroom finish _^_ ===" << endl;
return 0;
}


运行结果:
=== jhluroom start ========

adapter transfer for enplug ...

use an english plug
=== jhluroom finish _^_ ===
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息