Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
适配器模式应用例子_适配器设计模式,希望能够帮助你!!!。
1、问题背景
Adapter模式解决的问题在生活中经常会遇到:比如我们有一个Team为外界提供S类服务,但是我们Team里面没有能够完成此项任务的member,然后我们得知有A可以完成这项服务(这项任务提供的服务重新取了个名字叫S’,并且他不对外公布他的具体实现)。为了保证我们对外的服务类别的一致性(提供S服务),我们有以下两种方式解决这个问题:
1)把A君直接招安到我们Team为我们工作,提供S服务的时候让A君去办就是了;
2)A君可能在别的地方有工作,并且不准备接受我们的招安,于是我们Team可以想这样一种方式解决问题:我们安排B君去完成这项任务,并做好工作(Money)让B君工作的时候可以向A君请教,因此B君就是一个复合体(提供S服务,但是是A君的继承弟子)。
实际上在软件系统设计和开发中,这种问题也会经常遇到:我们为了完成某项工作购买了一个第三方的库来加快开发。这就带来了一个问题:我们在应用程序中已经设计好了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作了,Adapter模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口。
在上面生活中问题的解决方式也就正好对应了Adapter模式的两种类别:类模式和对象模式。
2、模式示意图
3、代码实现
3.1、Adapter(Class)
代码实现如下:
//////////////////////////////////////////////////////////////////////////
//Adapter.h
//////////////////////////////////////////////////////////////////////////
#ifndef _ADAPTER_H_
#define _ADAPTER_H_
#include <iostream>
using namespace std;
class Target
{
public:
Target();
virtual ~Target();
virtual void fnRequest();
protected:
private:
};
class Adaptee
{
public:
Adaptee();
~Adaptee();
void fnSpecificRequest();
protected:
private:
};
class Adapter:public Target,private Adaptee
{
public:
Adapter();
~Adapter();
void fnRequest();
protected:
private:
};
#endif //#ifndef _ADAPTER_H_
//////////////////////////////////////////////////////////////////////////
//Adapter.cpp
//////////////////////////////////////////////////////////////////////////
#include "Adapter.h"
Target::Target()
{
}
Target::~Target()
{
}
void Target::fnRequest()
{
cout<<"Target::Request"<<endl;
}
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
void Adaptee::fnSpecificRequest()
{
cout<<"Adaptee::SpecificRequest"<<endl;
}
Adapter::Adapter()
{
}
Adapter::~Adapter()
{
}
void Adapter::fnRequest()
{
this->fnSpecificRequest();
}
//////////////////////////////////////////////////////////////////////////
//main.cpp
//////////////////////////////////////////////////////////////////////////
#include "Adapter.h"
void main()
{
Target * pTarget = NULL;
pTarget = new Adapter();
pTarget->fnRequest();
delete pTarget;
pTarget = NULL;
}
运行结果如下:
3.2、Adapter(Object)
代码实现如下:
//////////////////////////////////////////////////////////////////////////
//Adapter.h
//////////////////////////////////////////////////////////////////////////
#ifndef _ADAPTER_H_
#define _ADAPTER_H_
#include <iostream>
using namespace std;
class Target
{
public:
Target();
virtual ~Target();
virtual void fnRequest();
protected:
private:
};
class Adaptee
{
public:
Adaptee();
~Adaptee();
void fnSpecificRequest();
protected:
private:
};
class Adapter:public Target
{
public:
Adapter(Adaptee* ade);
~Adapter();
void fnRequest();
protected:
private:
Adaptee* _ade;
};
#endif //#ifndef _ADAPTER_H_
//////////////////////////////////////////////////////////////////////////
//Adapter.cpp
//////////////////////////////////////////////////////////////////////////
#include "Adapter.h"
Target::Target()
{
}
Target::~Target()
{
}
void Target::fnRequest()
{
cout<<"Target::Request"<<endl;
}
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
void Adaptee::fnSpecificRequest()
{
cout<<"Adaptee::SpecificRequest"<<endl;
}
Adapter::Adapter(Adaptee* ade)
{
_ade = ade;
}
Adapter::~Adapter()
{
delete _ade;
_ade = NULL;
}
void Adapter::fnRequest()
{
_ade->fnSpecificRequest();
}
//////////////////////////////////////////////////////////////////////////
//main.cpp
//////////////////////////////////////////////////////////////////////////
#include "Adapter.h"
void main()
{
Target * pTarget = NULL;
pTarget = new Adapter(new Adaptee);
pTarget->fnRequest();
delete pTarget;
pTarget = NULL;
}
运行结果如下:
在Adapter模式中可以看到,类模式的Adapter采用继承的方式复用Adaptee的接口,而在对象模式的Adapter中我们则采用组合的方式实现Adaptee的复用。
4、总结与讨论
在Adapter模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统一共同接口)。在C++中的public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果,通过纯抽象基类模拟接口继承的效果,在其他语言中可以用 interface来获得专门的接口继承。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章