adapter为null_软件设计精要之——适配器(Adapter)模式
1、問題背景
Adapter模式解決的問題在生活中經(jīng)常會遇到:比如我們有一個Team為外界提供S類服務,但是我們Team里面沒有能夠完成此項任務的member,然后我們得知有A可以完成這項服務(這項任務提供的服務重新取了個名字叫S’,并且他不對外公布他的具體實現(xiàn))。為了保證我們對外的服務類別的一致性(提供S服務),我們有以下兩種方式解決這個問題:
1)把A君直接招安到我們Team為我們工作,提供S服務的時候讓A君去辦就是了;
2)A君可能在別的地方有工作,并且不準備接受我們的招安,于是我們Team可以想這樣一種方式解決問題:我們安排B君去完成這項任務,并做好工作(Money)讓B君工作的時候可以向A君請教,因此B君就是一個復合體(提供S服務,但是是A君的繼承弟子)。
實際上在軟件系統(tǒng)設計和開發(fā)中,這種問題也會經(jīng)常遇到:我們?yōu)榱送瓿赡稠椆ぷ髻徺I了一個第三方的庫來加快開發(fā)。這就帶來了一個問題:我們在應用程序中已經(jīng)設計好了接口,與這個第三方提供的接口不一致,為了使得這些接口不兼容的類(不能在一起工作)可以在一起工作了,Adapter模式提供了將一個類(第三方庫)的接口轉化為客戶(購買使用者)希望的接口。
在上面生活中問題的解決方式也就正好對應了Adapter模式的兩種類別:類模式和對象模式。
2、模式示意圖
圖1、類的適配器模式示意圖
圖2、對象的適配器模式示意圖
3、代碼實現(xiàn)
3.1、Adapter(Class)
代碼實現(xiàn)如下:
//
//Adapter.h
//
#ifndef _ADAPTER_H_
#define _ADAPTER_H_
#include
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<
}
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
void Adaptee::fnSpecificRequest()
{
cout<
}
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)
代碼實現(xiàn)如下:
//
//Adapter.h
//
#ifndef _ADAPTER_H_
#define _ADAPTER_H_
#include
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<
}
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
void Adaptee::fnSpecificRequest()
{
cout<
}
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中我們則采用組合的方式實現(xiàn)Adaptee的復用。
4、總結與討論
在Adapter模式的兩種模式中,有一個很重要的概念就是接口繼承和實現(xiàn)繼承的區(qū)別和聯(lián)系。接口繼承和實現(xiàn)繼承是面向對象領域的兩個重要的概念,接口繼承指的是通過繼承,子類獲得了父類的接口,而實現(xiàn)繼承指的是通過繼承子類獲得了父類的實現(xiàn)(并不統(tǒng)一共同接口)。在C++中的public繼承既是接口繼承又是實現(xiàn)繼承,因為子類在繼承了父類后既可以對外提供父類中的接口操作,又可以獲得父類的接口實現(xiàn)。當然我們可以通過一定的方式和技術模擬單獨的接口繼承和實現(xiàn)繼承,例如我們可以通過private繼承獲得實現(xiàn)繼承的效果,通過純抽象基類模擬接口繼承的效果,在其他語言中可以用 interface來獲得專門的接口繼承。
總結
以上是生活随笔為你收集整理的adapter为null_软件设计精要之——适配器(Adapter)模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wms地图绘制工具_GeoServer地
- 下一篇: java类的子类_java 查找类的所有