快速連結

2018年4月11日

Adapter Pattern:組合兩個不相干的執行需要一個轉接器

概念

當螢幕只有D-SUB,但卻要接主機只有DVI插孔的顯示卡時候,需要轉接器來轉換傳送訊號,這種改變既有內容去轉換需要結果時,就需要它。
很多人會想,那只要共同有一個Interface去繼承就好啦!
但是像是D-SUB這種已經定型的產品架構,你無法再重新改變它的定義與執行內容,你只能取出它並且改為新產品需要的資訊才能產生結果。
在這個之中,D-SUB被稱為Target,轉換對象;DVI被稱為Adaptee,適配者。

假如功能相差太多的兩種功能/產品,或是適配者有著轉換對象沒有的plugin,那就不適用這種設計模式。



用途

  • 機上盒的遙控器本來只有遙控機上盒,但該廠商又發行了電視產品,遙控機需要也能夠遙控該電視產品。
  • 軟體大更版的時候,需要新舊相容的狀況下。

參考

XYZ的筆記本:設計模式整理列表
阿洲的程式教學:轉接器模式(Adapter Pattern)
技術筆記:Adapter Pattern -- 換個包裝再度利用

CODE (C#)

本範例以「Object Adapter Pattern」此模式架構。

首先我們有兩個計算器接頭,一個是舊產品只能用二進制資料,一個是新產品使用十進位資料。

public class BinaryCalculator
{
    public void BinaryOut(byte Data) 
    {
        Console.WriteLine("BinaryOut : {0}", Data);   
    }
}



public class DecimalCalculator
{
    public void NormalOut(int Data) 
    {
        Console.WriteLine("NormalOut : {0}", Data);         
    }
}

新產品出現後,如果要能與舊產品接口互相搭配,就需要轉接器啦!
BinaryCalculator被稱為Target,轉換對象;DecimalCalculator被稱為Adaptee,適配者。


public class DecimalAdapter : BinaryCalculator
{
    private DecimalCalculator m_DecimalCalculator;
    public DecimalAdapter(DecimalCalculator Target)
    {
        m_DecimalCalculator = Target;
    }

    public void BinaryOut(byte Data)
    {
        decimal decValue = Data;
        m_DecimalCalculator.NormalOut((int)decValue);
    }
}

最後在main()內執行:

public class Program
{
    public static void Main(string[] args)
    {
        DecimalCalculator dcal = new DecimalCalculator();
        DecimalAdapter adapter = new DecimalAdapter(dcal);
        adapter.BinaryOut(0x3F);
    }
}

以上是超簡略的範例~希望可以幫助到大家!

沒有留言:

張貼留言

歡迎大家留言提問,我會答的都會盡力回答!
如果太久沒出現回應就是我又忘記回來看留言了TAT