GOF《設計模式》一書對Adapter模式是這樣描述的:
            
           將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使原本由于接口不兼容而不能一起工作的類可以一起工作。

              這段話大致是說:我們需要一種方式,為一個功能正確但接口不合的對象創建一個新接口。例如,客戶給我們如下需求:

          1) 為都有“顯示”(display)行為的點、線、正方形分別創建類。

          2) 客戶對象不必知道自己到底擁有點、線、還是正方形。它只需知道擁有這些形狀中的一個。

          也就是說,我們要用一個更高層次的概念將這些具體形狀都涵蓋進去,這個高層概念可以稱為:“可顯示的形狀”。因此,我們需要創建一個接口Shape:

          interface Shape{

              publicvoid display();

          }

          現在客戶忽然間有讓我們給這個系統增加一個畫圓的功能。這個看起來很簡單,只需定義一個Circle類來實現Shape接口,但是我們要給它編寫display方法,這可不是件簡單的事,假如此時我們正好發現一個XXCircle類,它有一個方法剛好可以完成這個功能,那么有沒有更好的方法來利用它呢,這時我們就要用到Adapter模式了。XXCircle代碼如下:

          class XXCircle{

              public void displayCircle(){

                 System.out.println("通過XXCircle.displayCircle()畫圓");

              }

          }

              Adapter模式有兩種類型:

          1)    對象Adapter模式,它依賴于一個對象(適配器)包含另一個對象(被適配的對象)

          class CircleObject implements Shape{

              public XXCircle circle;

              public CircleObject(XXCircle xxcircle){

              circle=xxcircle;

              }

              public void display() {

                 circle.displayCircle(); 

              }

          }

          public class Client {

              public static void main(String[] args) {

                 XXCircle circle=new XXCircle();

                 CircleObject co=new CircleObject(circle);

                 co.display();

              }

          }

          2)     類Adapter模式,它是通過多重繼承來實現的(java中沒有多繼承,是通過接口來實現的)。

          class CircleClass extends XXCircle implements Shape{

              public void display() {

                 super.displayCircle();  

              }

          }

          public class Client {

              public static void main(String[] args) {

                 CircleClass cc=new CircleClass();

                 cc.display();

              }

          }

              小結:Adapter模式是一個很常用的模式,它將一個(或多個)類的接口轉換成我們需要類所具備的一個接口。它的實現方式是:創建一個具備所需接口的類,然后包裝原有類的方法,這樣實際上就包含了被適配的對象。它主要適用于以下幾種情況:

          1) 你希望使用他人編寫的子程序或方法,因為你需要它所執行的功能。

          2) 你無法將這個子程序直接加入程序中。

          3) 子程序的接口或調用方式與需要使用它的相關對象不完全相同。

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 台安县| 云龙县| 凤凰县| 达孜县| 吕梁市| 新密市| 宁海县| 湖口县| 宁波市| 桦甸市| 互助| 长阳| 甘肃省| 浦县| 望奎县| 丰县| 延庆县| 白玉县| 万安县| 西乌| 曲麻莱县| 东莞市| 晋中市| 新余市| 五指山市| 东港市| 祁门县| 怀化市| 永福县| 湟中县| 广西| 张北县| 邢台市| 博野县| 化隆| 喀什市| 西贡区| 汶川县| 大田县| 海盐县| 西乡县|