設計模式_適配器模式(Java)

適配器模式(Adapter),別名:包裝器Wrapper,將一個類的接口轉換成Client希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。

時機:我們經常會碰到的情況是你無法修改你想要使用的類這些類庫是被發現而非被創建的,在這種情況下,我們可以考慮使用適配器模式。適配器中的代碼將接受你所擁有的接口,併產生你所需要的接口。適配器模式主要應用與希望複用一些現存的類,但是接口又與複用環境要求不一致的時候。

適配器模式有兩種不同的實現形式:類適配器模式(繼承實現)對象適配器模式(組合實現)

我們先來介紹類適配器模式,

1. 類適配器模式

類適配器模式就是通過繼承方式來實現適配,從而調用想要使用的方法。

類圖:

類適配器

可能剛看類圖有點懵逼,那麼我們就舉一個栗子來具體實現以下。

//package com.dlut.designpattern.adapter;

//Client期待的接口
public interface Target{
    public void request();
}

//需要進行適配的類
class Adaptee{
    public void specRequest(){
        System.out.println("特殊調用...");
    }
}

class Adapter extends Adaptee implements Target{
    public void request() {
        super.specRequest();
    }
}

測試類:

//package com.dlut.designpattern.adapter;

public class Test {
    public static void main(String[] args) {
        Target target=new Adapter();
        target.request();
    }
}

這裏我要着重強調一點,也是很多人的疑惑,Target必須爲interface接口還是可以定義爲類?使用Java實現適配器模式時,Target必須定義爲interface,原因是Java實現多繼承只能是通過定義接口的方式。所以說,這在一定程度上使得適配器模式的使用受到了限制。那麼我們如何來克服這種限制呢,那就是我們接下來介紹的對象適配器模式。

2. 對象適配器模式

對象適配器模式是通過組合方式來實現適配的。

類圖:
對象適配器

示例:

//package com.dlut.designpattern.adapter;

//Client期待的接口
public class Target{
    public void request(){
        System.out.println("普通調用...");
    }
}

//需要進行適配的類
class Adaptee{
    public void specRequest(){
        System.out.println("特殊調用...");
    }
}

class Adapter extends Target{
    private Adaptee adaptee=null;
    public Adapter(Adaptee adaptee){
        this.adaptee=adaptee;
    }
    public void request() {
        adaptee.specRequest();
    }
}

測試類:

//package com.dlut.designpattern.adapter;

public class Test {
    public static void main(String[] args) {
        Target target=new Adapter(new Adaptee());
        target.request();
    }
}

在學習適配器模式時,有時候會走入一個怪圈,就是容易想到去適配不同種類型的電壓、不同大小的物體之類的示例。然而,在我的理解中,適配器更強調的是“配”,就像它的別名一樣,它在更多情況下就是一個包裝器,如果我們能理解這種思想,然後回過頭來仔細觀察代碼時,我們就會恍然大悟,原來它是這個樣子的。

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章