程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++設計形式之適配器形式

C++設計形式之適配器形式

編輯:關於C++

C++設計形式之適配器形式。本站提示廣大學習愛好者:(C++設計形式之適配器形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式之適配器形式正文


生涯中的適配器

買筆記本電腦,買手機時,都有一個電源適配器,電源適配器又叫外置電源,是小型便攜式電子裝備及電子電器的供電電壓變換裝備,罕見於手機,筆記本電腦上。它的感化是將家裡的220V高電壓轉換成這些電子產物能任務的5V~20V閣下穩固的低電壓,使它們能正常任務。就是說,假如沒有這個電源適配器,我們的手機和電腦就不克不及停止充電了。

之前同事去日本出差,因為任務須要,就將本身的筆記本帶曩昔了。到了確當晚就喜劇了,筆記本沒法應用。因為日本的居平易近用電電壓是110V,而中國事220V,同事的筆記本是220V供電的。第二天,同事就去買了一個電壓適配器。假如沒有電壓適配器,估量此次出差都要喜劇了。

甚麼是適配器形式?

說了這麼多生涯中的適配器的例子,那末在軟件設計、開辟進程中,適配器又是個甚麼器械呢?

在GOF的《設計形式:可復用面向對象軟件的基本》中是如許說的:將一個類的接口轉換成客戶願望的別的一個接口。適配器形式使得本來因為接口不兼容而不克不及一路任務的那些類可以一路任務。比如日本如今就只供給110V的電壓,而我的電腦就須要220V的電壓,那怎樣辦啦?適配器就是干這活的,在不兼容的器械之間搭建一座橋梁,讓兩者能很好的兼容在一路任務。

為何要應用適配器形式?

在軟件開辟中,有的時刻體系的數據和行動都准確,但接口不相符,我們應當斟酌應用適配器形式,目標是使掌握規模以外的一個原有對象與某個接口婚配。舉個例子:在開辟一個模塊的時刻,有一個功效點完成起來比擬費力,然則,之前有一個項目標模塊完成了一樣的功效點;然則如今這個模塊的接口和之前的誰人模塊的接口是紛歧致的。此時,作為項目司理的你,該怎樣辦啦?固然是在中央加一層Wrapper了,也就是應用適配器形式,將之前完成的功效點適配進新的項目了。為何呢?重要是應用適配器形式有以下長處:

1.下降了去完成一個功效點的難度,可以對現有的類停止包裝,便可以停止應用了;

2.進步了項目質量,現有的類普通都是經由測試的,應用了適配器形式以後,不須要對舊的類停止周全的籠罩測試;

3.總的來講,進步了效力,下降了本錢。

甚麼時刻應用適配器形式?

1.每種設計形式都有它最實用的場所。適配器形式在以下場所下最實用:

2.應用一個曾經存在的類,假如它的接口和你現實請求的紛歧致時,可以斟酌應用適配器形式;
要在挪用者和功效供給者兩邊都不太輕易修正的時刻再應用適配器形式,而不是一有分歧時就應用它。

UML類圖

上圖是適配器形式的第一種完成情勢,適配器Adapter繼續自Target和Adaptee類,Adapter類須要重寫Target類的Request函數,在Request中做恰當的處置,挪用Adaptee類的SepcificRequest。終究,Target現實挪用的是Adaptee的SpecificRequest來完成Request的,完成適配;這類叫做類適配器。

上圖是適配器的第二種完成情勢,適配器Adapter類繼續自Target類,同時,在Adapter類中有一個Adaptee類型的成員變量;Adapter類重寫Request函數時,在Request中,應用Adaptee類型的成員變量挪用Adaptee的SpecificRequest函數,終究完成適配;這類叫做對象適配器。

類適配器和對象適配器的比擬

既然有了類適配器和對象適配器,那末在現實中若何在兩者之間做選擇呢?

類適配器有以下特色:

1.因為Adapter直接繼續自Adaptee類,所以,在Adapter類中可以對Adaptee類的辦法停止重界說;

2.假如在Adaptee中添加了一個籠統辦法,那末Adapter也要停止響應的修改,如許就帶來高耦合;

3.假如Adaptee還有其它子類,而在Adapter中想挪用Adaptee其它子類的辦法時,應用類適配器是沒法做到的。

對象適配器有以下特色:

1.有的時刻,你會發明,不是很輕易去結構一個Adaptee類型的對象;

2.當Adaptee中添加新的籠統辦法時,Adapter類不須要做任何調劑,也能准確的停止舉措;

3.可使用多肽的方法在Adapter類中挪用Adaptee類子類的辦法。

因為對象適配器的耦合度比擬低,所以在許多的書中都建議應用對象適配器。在我們現實項目中,也是如斯,能應用對象組合的方法,就不應用多繼續的方法。

代碼完成

類適配器的完成代碼


/*
** FileName     : AdapterPatternDemo
** Author       : Jelly Young
** Date         : 2013/11/27
** Description  : More information, please go to http://www.jellythink.com
*/
 
#include <iostream>
using namespace std;
 
// Targets
class Target
{
public:
    virtual void Request()
    {
        cout<<"Target::Request"<<endl;
    }
};
 
// Adaptee
class Adaptee
{
public:
    void SpecificRequest()
    {
        cout<<"Adaptee::SpecificRequest"<<endl;
    }
};
 
// Adapter
class Adapter : public Target, Adaptee
{
public:
    void Request()
    {
        Adaptee::SpecificRequest();
    }
};
 
// Client
int main(int argc, char *argv[])
{
    Target *targetObj = new Adapter();
    targetObj->Request();
 
    delete targetObj;
    targetObj = NULL;
 
    return 0;
}

對象適配器的代碼完成


/*
** FileName     : AdapterPatternDemo
** Author       : Jelly Young
** Date         : 2013/11/27
** Description  : More information, please go to http://www.jellythink.com
*/
 
#include <iostream>
using namespace std;
 
class Target
{
public:
    Target(){}
    virtual ~Target(){}
    virtual void Request()
    {
        cout<<"Target::Request"<<endl;
    }
};
 
class Adaptee
{
public:
    void SpecificRequest()
    {
        cout<<"Adaptee::SpecificRequest"<<endl;
    }
};
 
class Adapter : public Target
{
public:
    Adapter() : m_Adaptee(new Adaptee) {}
 
    ~Adapter()
    {
        if (m_Adaptee != NULL)
        {
            delete m_Adaptee;
            m_Adaptee = NULL;
        }
    }
 
    void Request()
    {
        m_Adaptee->SpecificRequest();
    }
 
private:
    Adaptee *m_Adaptee;
};
 
int main(int argc, char *argv[])
{
    Target *targetObj = new Adapter();
    targetObj->Request();
 
    delete targetObj;
    targetObj = NULL;
 
    return 0;
}

總結

適配器形式很輕易懂得和完成,在今後的項目中,多多的停止理論,將學到的實際常識應用到現實的項目中去,寫出英俊的代碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved