日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

adapter为null_软件设计精要之——适配器(Adapter)模式

發(fā)布時間:2024/1/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 adapter为null_软件设计精要之——适配器(Adapter)模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。