1. 程式人生 > >設計模式之禪(5)-介面卡模式

設計模式之禪(5)-介面卡模式

文章目錄


更多關於設計模式的文章請點選設計模式之禪(0)-目錄頁


介面卡模式是面向物件設計模式中常用的一種模式,它能將一個類的介面轉換成使用者希望的另一個介面,讓原本不相容的程式介面能夠相互協作。
在這裡插入圖片描述

一、介面卡模式是什麼

**介面卡模式(Adapter Pattern)**的定義是: 將一個類的介面適配成使用者所期待的。一個適配允許通常因為介面不相容而不能在一起工作的類工作在一起,做法是將類自己的介面包裹在一個已存在的類中。

在這裡插入圖片描述

二、把鴨子“適配”為狗

又要以我們可愛的動物園動物作為栗子了。本次我要做的是將鴨子介面通過介面卡的方式適配為狗介面:

在這裡插入圖片描述

  • Duck
/**
 * @Description: Duck介面
 * @CreateDate: Created in 2018/11/28 20:35
 * @Author: <a href="https://blog.csdn.net/pbrlovejava">arong</a>
 */
public interface Duck {

    //鴨子叫
    public void duckCall();
}
  • Dog
/**
 * @Description: Dog介面
 * @CreateDate: Created in 2018/11/28 20:32
 * @Author: <a href="https://blog.csdn.net/pbrlovejava">arong</a>
 */
public interface Dog {
    //犬吠
     public void DogCall();
}
  • WildDuck
/**
 * @Description: Duck的實現類
 * @CreateDate: Created in 2018/11/28 20:37
 * @Author: <a href="https://blog.csdn.net/pbrlovejava">arong</a>
 */
public class WildDuck implements Duck { @Override public void duckCall() { System.out.println("鴨子叫噠噠噠"); } }
  • DuckToDogAdapter
/**
 * @Description: Duck介面轉換成Dog介面的介面卡
 * @CreateDate: Created in 2018/11/28 20:34
 * @Author: <a href="https://blog.csdn.net/pbrlovejava">arong</a>
 */
public class DuckToDogAdapter implements Dog{

    private Duck duck;

    public DuckToDogAdapter(Duck duck){
        this.duck = duck;//物件組合
    }

    @Override
    public void DogCall() {
        //介面卡將狗叫轉換成了鴨子叫
        duck.duckCall();
    }
}
  • Client
/**
 * @Description: 呼叫狗介面的客戶類
 * @CreateDate: Created in 2018/11/28 20:40
 * @Author: <a href="https://blog.csdn.net/pbrlovejava">arong</a>
 */
public class Client {

    public static void TestDog(Dog dog){
        dog.DogCall();
    }

}

以上就是介面卡模式的簡單栗子,現在通過測試類去測試它:

  • TestAdapterPattern
/**
 * @Description: 測試介面卡模式 Dog-》Duck
 * @CreateDate: Created in 2018/11/28 20:41
 * @Author: <a href="https://blog.csdn.net/pbrlovejava">arong</a>
 */
    public class TestAdapterPattern {

    @Test
    public void testDogToDuck(){

        //建立野鴨子物件
        WildDuck duck = new WildDuck();
        //建立介面卡物件,用介面卡將鴨子轉化為狗
        DuckToDogAdapter adapter = new DuckToDogAdapter(duck);
        //呼叫客戶端測試
        Client.TestDog(adapter);
    }
}

執行結果:
在這裡插入圖片描述

三、把列舉介面適配為迭代器介面

在這裡插入圖片描述

  • EIAdaptor
/**
 * @Description: 列舉適配為迭代器
 * @CreateDate: Created in 2018/11/28 23:27
 * @Author: <a href="https://blog.csdn.net/pbrlovejava">arong</a>
 */
public class EIAdaptor implements Iterator{
    private Enumeration enumeration;

    public EIAdaptor(Enumeration e){
        enumeration = e;
    }


    @Override
    public boolean hasNext() {
        return enumeration.hasMoreElements();
    }

    @Override
    public Object next() {
        return enumeration.nextElement();
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }

    @Override
    public void forEachRemaining(Consumer action) {
        throw new UnsupportedOperationException();
    }
}