1. 程式人生 > >設計模式(七)—— 介面卡模式

設計模式(七)—— 介面卡模式

一、含義

將一個類的介面,轉換成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間,也就是說介面卡模式是在原有一個類的基礎上,在不改變這個類的程式碼時,新建一個類將其原來的類,進行封裝改變,以符合新的需求。

二、要點

1.當需要使用一個現有的類而其介面並不符合你的需要時,就使用介面卡。

2.介面卡模式有兩種形式:物件介面卡和類介面卡。類介面卡需要用到多重繼承來實現,所以在java中只能實現物件介面卡,java不支援多重繼承。

3.實現一個介面卡的複雜程度,是根據在要實現的目標介面的大小和複雜度而定的。

三、實戰分析介面卡模式

首先來看一下介面卡模式的類圖:

我們看看一個古話,叫做掛羊頭賣狗肉,其實就可以用介面卡模式來實現,首先我們需要例項一個通用的羊的介面和一個具體的羊的實現類

//這是一個羊的介面
public interface Sheep {

    //羊肉的味道
    public void taste();

    //羊的外觀
    public void appearance();
}
//一個羊的具體實現類
public class Goat implements Sheep {
    
    @Override
    public void taste() {
        System.out.println("我的味道很鮮美");
    }

    @Override
    public void appearance() {
        System.out.println("我有一對羊角");
    }
}

然後就是例項一個狗的介面和一個具體的類


//這個一個狗的例項
public interface Dog {

    //狗肉的味道
    public void taste();

    //狗的外觀
    public void appearance();
}
//這是一個具體的狗的實體
public class RuralDog implements Dog {
    
    @Override
    public void taste() {
        System.out.println("狗肉的味道");
    }

    @Override
    public void appearance() {
        System.out.println("狗頭狗腦的");
    }
}

因為羊肉的價格貴一點,所以就用狗肉去充當羊肉去賣,這個時候就需要一個介面卡,將狗肉轉換成羊肉去買,適配的程式碼如下:

//介面卡需要實現目標介面,也就是羊的介面
public class DogAdapte implements Sheep {
    
    //需要一個被轉化的物件,也就是一條狗的例項
    Dog dog;

    public DogAdapte(Dog dog) {
        this.dog = dog;
    }

    @Override
    public void taste() {
        dog.taste();
    }

    @Override
    public void appearance() {
        dog.appearance();
    }
}

最後編寫程式碼來測試一下:

public class SheepTest {

    public static void main(String[] args) {
        Goat goat = new Goat();
        RuralDog ruralDog = new RuralDog();
        
        Sheep dogAdapte = new DogAdapte(ruralDog);

        System.out.println("DogAdapte says:");
        testSheep(dogAdapte);
        
    }
    
    static void testSheep(Sheep sheep) {
        sheep.taste();
        sheep.appearance();
    }
}

測試結果如下:

DogAdapte says:
狗肉的味道
狗頭狗腦的

呼叫的是狗的味道,但返回給客戶是一個羊的物件,這就是掛羊頭賣狗肉,看著是個羊,買的其實是狗肉。