adapter pattern--適配器模式


adapter pattern,又稱wrapper(包裝) pattern
在軟件系統中,由於應用環境的變化,常常需要將一些現存的對象放在新的環境中應用,但是新環境要求的接口是這些現存對象所不滿足的。Adapter設計模式就是為了應對這種遷移的變化,以使客戶系統既能利用現有對象的良好實現,同時又能滿足新的應用環境所要求的接口。
“Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.” ---GoF
 
將一個類的接口轉化為客戶端所期望的接口。適配器模式使得原本擁有不兼容接口的類能一起“工作”。--GoF
 
適配器一般有兩種形式:
第一種形式

該形式是采用繼承方式實現復用Adaptee接口。
 
實例解析:
    例如有一個人看電視,現在想換台了,有一個換台請求的接口,而電視機也可以接收信號換台,它擁有一個接收信號的接口,現在很清楚這兩個類之間不兼容,我們需要一個適配器來使得這兩個擁有不兼容接口的類一起工作。采取繼承復用的方式。
 1 class IdeaChange
 2 {
 3     public:
 4         virutal void RequestChange( )=0;
 5 };
 6 class Tv
 7 {
 8     public:
 9         void AcceptRequest( );  
10 };
11 void Tv::AcceptRequest( )
12 {
13     std::cout<<"Accept the request of ChannelChange"<<std::endl; 
14 }
15 class Adapter:public IdeaChange,private Tv
16 {
17     public:
18         void RequestChange( );
19 };
20 void Adapter::RequestChange( )
21 {
22     std::cout<<"Request for change channel"<<std::endl;
23     AcceptRequest( );
24 }
25 
26 int main(int argc,char ** argv)
27 {
28   Adapter a;
29   a.RequestChange( );
30   return 0;  
31 }

 

運行結果

第二種形式

該形式是采用組合方式實現復用Adaptee接口。
還是上面一樣的實例
 1 class IdeaChange
 2 {
 3     public:
 4         virutal void RequestChange( )=0;
 5 };
 6 class Tv
 7 {
 8     public:
 9         void AcceptRequest( );  
10 };
11 void Tv::AcceptRequest( )
12 {
13     std::cout<<"Accept the request of ChannelChange"<<std::endl; 
14 }
15 class Adapter:public IdeaChange
16 {
17     public:
18         Adapter( );
19         ~Adapter( );
20         void RequestChange( );
21     private:
22         Tv* t;
23         
24 };
25 Adapter::Adapter( )
26 {
27     t=new Tv( );
28 }
29 Adapter::~Adapter( )
30 {
31     delete t;
32 }
33 void Adapter::RequestChange( )
34 {
35     std::cout<<"Request for change channel"<<std::endl;
36     t->AcceptRequest( );
37 }
38 
39 int main(int argc,char ** argv)
40 {
41   Adapter a;
42   a.RequestChange( );
43   return 0;  
44 }

 

運行結果為


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM