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 }
運行結果為

