設計模式(七)—— 介面卡模式
阿新 • • 發佈:2019-01-26
一、含義
將一個類的介面,轉換成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間,也就是說介面卡模式是在原有一個類的基礎上,在不改變這個類的程式碼時,新建一個類將其原來的類,進行封裝改變,以符合新的需求。
二、要點
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:
狗肉的味道
狗頭狗腦的
呼叫的是狗的味道,但返回給客戶是一個羊的物件,這就是掛羊頭賣狗肉,看著是個羊,買的其實是狗肉。