iT邦幫忙

2022 iThome 鐵人賽

DAY 7
1

外接螢幕的故事

之前疫情嚴重時有居家工作一段時間,而公司的筆電是14吋,在家的話想當然就是要爽爽外接大螢幕嘛(竊笑)!於是我就跑去賣場買了一台27吋的螢幕,配合家中原本的27吋螢幕雙開,準備好好的來「開拓視野」。

當接好一台螢幕後,我突然意識到一個問題,公司筆電只有一個HDMI的接口…(哭阿),好在賣場還沒關門,馬上手刀趕去買了一個 Type-C 轉 HDMI 的轉接器,回家後將轉接器的 Type-C 一端(公)插在筆電的 Type-C 接口(母),再將螢幕的HDMI(公)插在轉接器的HDML接口(母)。耶嘿!成功了,加上筆電本身的話我就有三螢幕了,可喜可賀。

以上透過 Type-C 轉 HDMI 的轉接器,完成不同規格轉接的使命,用成設計模式的觀點來看,就稱之為『Adapter』模式!

Adapter - 定義

將一個類別的介面轉換成客戶希望的另一個介面。Adapter模式使原本由於介面不相容而不能一起工作的類別可以一起工作。

https://ithelp.ithome.com.tw/upload/images/20220918/20136443CLn7pkdvjs.png

(圖片來源:https://upload.wikimedia.org/wikipedia/commons/d/d7/ObjectAdapter.png)

轉接器UML

https://ithelp.ithome.com.tw/upload/images/20220918/20136443uhjU34WdaC.png

不囉嗦上Code!

class Program
{
    static void Main(string[] args)
    {
        Typec typec = new Typec();
        IHdmi typecToHdmiAdapter = new TypecToHdmiAdapter(typec);
        typecToHdmiAdapter.HdmiConnect();
    }
}

public interface IHdmi
{
    void HdmiConnect();
}

public interface ITypec
{
    void TypecConnect();
}

public class TypecToHdmiAdapter : IHdmi
{
    private readonly ITypec _typec;

    public TypecToHdmiAdapter(ITypec typec)
    {
        this._typec = typec;
    }

    public void HdmiConnect()
    {
        _typec.TypecConnect();
        Console.WriteLine("轉接完成");
    }
}

public class Typec : ITypec
{
    public void TypecConnect()
    {
        Console.WriteLine("TypeC連接成功");
    }
}
  • 結果

https://ithelp.ithome.com.tw/upload/images/20220918/20136443GgReEMYl0f.png

淺談Adapter 與 Facade的差異

從概念上來看,這兩種模式都是在做『包裝』,似乎是有點類似,但還是有些區別:

Facade Adapter
是否存在既有類別
是否必須依某個介面設計
物件是否需要多型行為 可能
是否需要更簡單的介面

簡單的小結

Facade模式是簡化了介面,Adapter模式是將一個已有的介面轉換成另一個介面。

在範例程式碼中,是還有再優化的空間,像是 TypecToHdmiAdapter 類別其實應該變成一個更通用的 Adapter 類別,並且能夠轉換的不只是 TypeC而已 (目前是寫死在類別中),這部份我們會在之後的 『Strategy』模式做介紹,那我們明天見囉~


上一篇
【DAY6】Facade模式 - 今晚...我想來點麥當勞(上)
下一篇
【DAY8】用『新』看物件導向的世界
系列文
勇闖秘境!探索物件導向背後的設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言